Cryptographically random numbers
Tim Hochberg
tim.hochberg at ieee.org
Tue Mar 7 19:45:09 EST 2006
Paul Rubin wrote:
> "Tuvas" <tuvas21 at gmail.com> writes:
>
>>I've actually done the tests on this one, it's actually faster to use
>>the += than a list, odd as it may sound.
>
>
> Frederik explained the reason; there's an optimization in Python 2.4
> that I'd forgotten about, for that specific case. It's not in earlier
> versions. It's a bit fragile in 2.4:
>
> a = ''
> for x in something:
> a += g(x)
>
> is fast, but if a is aliased, Python can't do the optimization, so
>
> a = ''
> b = a
> for x in something:
> a += g(x)
>
> is slow.
Is this really true? After the first time through the loop, 'a' won't be
aliased any more since strings are immutable. After that the loops
should be equivalent. I tried this out to see if I could see a timing
difference, in case I was missing something, with Python 2.4.1, the
following two snippets timed essentially the same for N up to 2**20 (I
didn't try any higher):
def concat1():
a = ''
for x in ' '*N:
a += x
return a
def concat2():
a = ''
b = a
for x in ' '*N:
a += x
return a
Regards,
-tim
> Figuring out which case to use relies on CPython's reference
> counting storage allocator (the interpreter keeps track of how many
> pointers there are to any given object) and so the optimization may
> not be feasible at all in other implementations which use different
> storage allocation strategies (e.g. Lisp-style garbage collection).
>
> All in all I think it's best to use a completely different approach
> (something like StringBuffer) but my effort to start a movement here
> on clpy a couple months ago didn't get anywhere.
More information about the Python-list
mailing list