[Cython] SEP 201 draft: Native callable objects

Dag Sverre Seljebotn d.s.seljebotn at astro.uio.no
Thu May 31 16:04:12 CEST 2012

[Discussion on numfocus at googlegroups.com please]

I've uploaded a draft-state SEP 201 (previously CEP 1000):


Many callable objects are simply wrappers around native code. This holds 
for any Cython function, f2py functions, manually written CPython 
extensions, Numba, etc.

Obviously, when native code calls other native code, it would be nice to 
skip the significant cost of boxing and unboxing all the arguments.

The thread about this on the Cython list is almost endless:


There was a long discussion on the key-comparison vs. interned-string 
approach. I've written both up in SEP 201 since it was the major point 
of contention. There was some benchmarks starting here:


And why provide a table and not a get_function_pointer starting here:


For those who followed that and don't want to read the entire spec, the 
aspect of flags is new. How do we avoid to duplicate entries/check 
against two signatures for cases like a GIL-holding caller wanting to 
call a nogil function? My take: For key-comparison you can compare under 
a mask, for interned-string we should have additional flags field.

The situation is a bit awkward: The Cython list consensus (well, me and 
Robert Bradshaw) decided on what is "Approach 1" (key-comparison) in SEP 
201. I pushed for that.

Still, now that a month has passed, I just think key-comparison is too 
ugly, and that the interning mechanism shouldn't be *that* hard to code 
up, probably 500 lines of C code if one just requires the GIL in a first 
iteration, and that keeping the spec simpler is more important.

So I'm tentatively proposing Approach 2.


More information about the cython-devel mailing list