List comprehensions performance
Bengt Richter
bokr at oz.net
Thu Sep 30 17:22:49 EDT 2004
On Thu, 30 Sep 2004 20:13:04 +0200, aleaxit at yahoo.com (Alex Martelli) wrote:
>Bengt Richter <bokr at oz.net> wrote:
> ...
>> >...but if the for loop is NOT equivalent (it doesn't accumulate results
>> >into a resulting list), it's still faster. As I posted:
>> >
>> >kallisti:~/cb alex$ python2.4 timeit.py -s'def f():pass' 'for x in
>> >xrange(999): f()'
>> >1000 loops, best of 3: 1.29e+03 usec per loop
>> >kallisti:~/cb alex$ python2.4 timeit.py -s'def f():pass' '[f() for x in
>> >xrange(999)]'
>> >1000 loops, best of 3: 1.45e+03 usec per loop
>> >
>> >the LC is paying for the building of a list of 999 references to None,
>> >which the for loop easily avoids, so the for loop is much faster here.
>>
>> What if you abuse the LC so it makes an empty list? E.g.,
>> [None for x in xrange(999) if f() and False]
>
>Now tell me, is timing so HARD...?! This obfuscation times (on 2.4 and
>the same old iBook as above) to 1.38e+03 usec per loop, still slower
>than the plain old loop -- the if/and rigmarole costs...
>
Sure, I was just wondering what would happen if you traded that for list growth overhead.
Anyway, thanks. It _is_ hard to compare with someone else's previous timing numbers ;-)
Maybe timeit.py should have an option for bogomips normalization or returning
time*bogomips. My system needs an upgrade ;-)
Regards,
Bengt Richter
More information about the Python-list
mailing list