performance of script to write very long lines of random chars

gry georgeryoung at gmail.com
Wed Apr 10 22:40:40 EDT 2013


On Apr 10, 9:52 pm, Michael Torrie <torr... at gmail.com> wrote:
> On 04/10/2013 07:21 PM, gry wrote:
>
>
>
>
>
>
>
>
>
> > from sys import stdout
> > from array import array
> > import random
> > nchars = 32000000
> > rows = 10
> > avail_chrs =
> > '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&
> > \'()*+,-./:;<=>?@[\\]^_`{}'
> > a = array('c', 'X' * nchars)
>
> > for l in range(rows):
> >     for i in xrange(nchars):
> >         a[i] = random.choice(avail_chrs)
> >     a.tofile(stdout)
> >     stdout.write('\n')
>
> > This version using array took 4 min, 29 sec, using 34MB resident/110
> > virtual. So, much smaller than the first attempt, but a bit slower.
> > Can someone suggest a better code?  And help me understand the
> > performance issues here?
>
> Why are you using an array?  Why not just rely on the OS to buffer the
> output.  Just write your characters straight to stdout instead of
> placing them in an array.
>
> At that point I believe this program will be as fast as is possible in
> Python.

Appealing idea, but it's slower than the array solution: 5min 13
secs.  vs 4min 30sec for the array:

for l in range(rows):
    for i in xrange(nchars):
        stdout.write(random.choice(avail_chrs))
    stdout.write('\n')


os.urandom does look promising -- I have to have full control over the
charset, but urandom is very fast at generating big random strings...
stay tuned...



More information about the Python-list mailing list