[Cython] Bindings performance issue

mark florisson markflorisson88 at gmail.com
Wed Jun 1 12:02:12 CEST 2011


On 31 May 2011 20:25, Vitja Makarov <vitja.makarov at 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 at 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


More information about the cython-devel mailing list