On 31 May 2011 20:25, Vitja Makarov <vitja.maka...@gmail.com> wrote: > Hi! > > Is bindings performance issue valuable? > > $ cat bindbench.pyx > def wo_bindings(): > pass > > def outer(): > def inner(): > pass > return inner > with_bindings = outer() > > $ python >>>> import timeit >>>> timeit.repeat('with_bindings()', setup='from bindbench import wo_bindings, >>>> with_bindings', repeat=1, number=100000000) > [6.169871807098389] >>>> timeit.repeat('wo_bindings()', setup='from bindbench import wo_bindings, >>>> with_bindings', repeat=1, number=100000000) > [4.609416961669922] > > PyCBindings makes it 1.3 (difference is about 15ns on my laptop) times > slower for CPython interpreter execution. > As CPython has some optimizations for CFunctions and PyCFunctions. > > Does it make sense for us? Or we can easily switch to bindings? > > -- > vitja. > _______________________________________________ > cython-devel mailing list > cython-devel@python.org > http://mail.python.org/mailman/listinfo/cython-devel >
I think switching should be fine, if you'd desperately need the speed you'd be calling c(p)def functions from Cython. In fact, when the fused cfunction will be ready it will be even slightly slower, as it overrides the tp_call. But perhaps that should really be made into a subclass... Anyway, would you use these for Python classes and module-level def functions (and closures) only, or would you also use them in extension classes? Because I found at least a bit of problem there, as extension class methods get 'self' passed as the first argument to the C function (as PyCFunctionObject.m_self), whereas methods in Python classes get 'self' passed in the args tuple (and the m_self is unused). Mark _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel