get-a-cup-of-coffee slow

Grant Griffin not.this at
Thu Aug 9 22:24:03 CEST 2001

Hi Gang,

I tried the following today:

   def gen_sectors1():
       print 'Generating (Version 1)...',
       s = '' 
       for i in xrange(65536):
           s += chr(i & 0xFF)
       for i in xrange(65536):
           s += chr((65535 - i) & 0xFF);
       print 'done'
       return s

I knew from the get-go that this wasn't the fastest thing in the world, but I
was _quite_ surprised that it took about a minute-and-a-half on an 800 MHz

I then rewrote it as:

   def gen_sectors2):
       print 'Generating (Version 2)...',
       s = ''
       forward = ''
       reverse = ''
       for i in xrange(256):
           forward += chr(i)
           reverse += chr(255 - i)
       s += forward * 256
       s += reverse * 256
       print 'done'
       return s

which produces the same data, yet runs so fast as to seem instantaneous.  (I
doubt that I saved a minute-and-a-half by rewriting it, though <wink>.)

Why is the first one so slow?  I assume it has to do with repeatedly appending
characters to a string.  If so, is it because "s +=" is implemented as "s = s
+", where the new one is always an appended copy of the original?  (I guess I
would hope that in the case of a string "+=" operation, Python would leave a
little spare space at the end of the new string so multiple appends would not
have to make a copy with _each_ append.)

Also, I tried writing something like this with a list (which are presumably more
suited to being appended), but then I realized that I didn't know how to write
the contents of a list to a file as a stream of bytes.  There's probably a
simple way to do that: what is it?

not-used-to-being-surprised-by-python-ly y'rs,



Grant R. Griffin                                       g2 at
Publisher of dspGuru                 
Iowegian International Corporation  

More information about the Python-list mailing list