[Python-Dev] accumulator display syntax

Alex Martelli aleaxit at yahoo.com
Tue Oct 21 17:16:22 EDT 2003


On Tuesday 21 October 2003 10:46 pm, Guido van Rossum wrote:
>   y = 1
>   sum([x*y for x in R])
>
> fares compared to
>
>   y = 1
>   def gen():
>      for x in R: yield y*y
>   sum(gen())

module a.py being:

R = [range(N) for N in (10, 100, 10000)]

def lc(R):
  y = 1
  sum([x*y for x in R])

def gen1(R):
  y = 1
  def gen():
     for x in R: yield y*y
  sum(gen())

def gen2(R):
  y = 1
  def gen(R=R, y=y):
     for x in R: yield y*y
  sum(gen())

i measure:

for N=10:
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.lc(a.R[0])'
100000 loops, best of 3: 12.3 usec per loop
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.gen1(a.R[0])'
100000 loops, best of 3: 10.4 usec per loop
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.gen2(a.R[0])'
100000 loops, best of 3: 9.7 usec per loop

for N=100:
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.lc(a.R[1])'
10000 loops, best of 3: 93 usec per loop
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.gen1(a.R[1])'
10000 loops, best of 3: 59 usec per loop
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.gen2(a.R[1])'
10000 loops, best of 3: 55 usec per loop

for N=10000:
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.lc(a.R[2])'
100 loops, best of 3: 9.4e+03 usec per loop
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.gen1(a.R[2])'
100 loops, best of 3: 5.6e+03 usec per loop
[alex at lancelot bo]$ timeit.py -c -s'import a' 'a.gen2(a.R[2])'
100 loops, best of 3: 5.2e+03 usec per loop

I think it's well worth overcoming come "community resistance
to new syntax" to get this kind of advantage easily.  The trick
of binding outer-scope variables as default args is neat but
buys less than the pure idea of just using a generator rather
than a list comprehension.


Alex




More information about the Python-Dev mailing list