Anyone happen to have optimization hints for this loop?

Terry Reedy tjreedy at udel.edu
Wed Jul 9 13:42:14 EDT 2008



Diez B. Roggisch wrote:
> dp_pearce wrote:



>>
>> count = 0
>> dmntString = ""
>> for z in range(0, Z):
>>     for y in range(0, Y):
>>         for x in range(0, X):
>>             fraction = domainVa[count]
>>             dmntString += "  "
>>             dmntString += fraction

Minor point, just construct "  "+domain[count] all at once

>>             count = count + 1
>>         dmntString += "\n"
>>     dmntString += "\n"
>> dmntString += "\n***\n
>>
>> dmntFile     = open(dmntFilename, 'wt')
>> dmntFile.write(dmntString)
>> dmntFile.close()
>>
>> I have found that it is currently taking ~3 seconds to build the
>> string but ~1 second to write the string to file, which seems wrong (I
>> would normally guess the CPU/Memory would out perform disc writing
>> speeds).
>>
>> Can anyone see a way of speeding this loop up? Perhaps by changing the
>> data format? Is it wrong to append a string and write once, or should
>> hold a file open and write at each instance?
> 
> Don't use in-place adding to concatenate strings. It might lead to
> quadaratic behavior.

Semantically, repeated extension of an immutable is inherently 
quadratic.  And it is for strings in Python until 2.6 or possibly 2.5 
(not sure), when more sophisticated code was added because people kept 
falling into this trap.  But since the more sophisticated code 'cheats' 
by mutating the immutable (with an algorithm similar to list.extend),I 
am pretty sure it will only be used when there is only one reference to 
the string and the extension is with +=, so that the extension can 
reliably be done in-place without changing semantics.  Thus, Python 
programmers should still learn the following.

> Use the "".join()-idiom instead:

(Or upgrade)
> 
> dmntStrings = []
> ....
>     dmntStrings.append("\n")
> ....
> dmntFile.write("".join(dmntStrings))

Note that the minor point above will cut the number of things to be 
joined nearly in half.

tjr




More information about the Python-list mailing list