Possible memory leak?

Steven D'Aprano steve at REMOVEMEcyber.com.au
Wed Jan 25 03:49:24 EST 2006


Giovanni Bajo wrote:

> Steven D'Aprano wrote:
> 
> 
>>But the real killer is this one line:
>>
>>row=row+chr(num/64)
>>
>>Bad, bad BAD idea. Every time you add two strings together, Python
>>has to copy BOTH strings. As row gets huge, this takes longer and
>>longer to do.
> 
> 
> This is no longer true as of CPython 2.4 though. I'm not sure which version the
> OP was using because he didn't say.

No, that's not correct. You are making a false 
assumption. This is from the "What's New" for Python 2.4:

[quote]
String concatenations in statements of the form s = s + 
"abc" and s += "abc" are now performed more efficiently 
in certain circumstances. This optimization won't be 
present in other Python implementations such as Jython, 
so you shouldn't rely on it; using the join() method of 
strings is still recommended when you want to 
efficiently glue a large number of strings together.
[end quote]

Note the "more efficiently in CERTAIN CIRCUMSTANCES" 
[emphasis added]? That certainly does not mean that 
concatenating large numbers of strings is no longer 
slow. It just means that *sometimes* (almost always? 
often? occasionally?) it isn't as slow as it used to be.

We really don't know what the optimization recognises, 
how it works, or how fast a difference it makes. 
Writing poor code, and trusting an implementation-
specific optimization to make it run "faster" (how much 
faster?) is always a dangerous strategy.

Better to avoid the temptation if you can, appreciate 
the improved performance for those times when you do 
string concatenation, but continue to use the join 
method anytime you are adding large numbers of strings.


-- 
Steven.




More information about the Python-list mailing list