Hi,

here's a little generator benchmark:

======================
def cgen(a,b):
     while 1:
         yield a+b

d = {}
exec '''
def pygen(a,b):
     while 1:
         yield a+b
''' in d

pygen = d['pygen']


def repeat_gen(gen, int count):
     cdef int i
     for i in range(count):
         next(gen)
     try:
         gen.throw(GeneratorExit)
     except GeneratorExit:
         pass
======================

timeit gives me this in Py3.2:

$ python3 -m timeit -s 'from genbench import repeat_gen, cgen, pygen'
     'repeat_gen(pygen(1,2), 10000)'
1000 loops, best of 3: 827 usec per loop

$ python3 -m timeit -s 'from genbench import repeat_gen, cgen, pygen'
      'repeat_gen(cgen(1,2), 10000)'
1000 loops, best of 3: 271 usec per loop


And here's another one where we add Cython's looping advantage:

======================
def cgen(a,b):
     cdef int i
     for i in range(a):
         yield b

d = {}
exec '''
def pygen(a,b):
     for i in range(a):
         yield b
''' in d

pygen = d['pygen']


def repeat_gen(gen):
     for _ in gen:
         pass
======================

$ python3 -m timeit -s 'from genbench import repeat_gen, cgen, pygen'
     'repeat_gen(pygen(10000, 2))'
1000 loops, best of 3: 881 usec per loop
$ python3 -m timeit -s 'from genbench import repeat_gen, cgen, pygen'
     'repeat_gen(cgen(10000, 2))'
10000 loops, best of 3: 116 usec per loop


That's not too bad for a start.

Stefan
_______________________________________________
Cython-dev mailing list
Cython-dev@codespeak.net
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to