[Cython] Better call optimisation
Stefan Behnel
stefan_ml at behnel.de
Mon Mar 9 13:17:51 CET 2009
Hi,
there are a couple of tickets related to call optimisations.
http://trac.cython.org/cython_trac/ticket/3
http://trac.cython.org/cython_trac/ticket/131
http://trac.cython.org/cython_trac/ticket/166
The getattr3() problem also relates to other cases, such as the fact that
we can't currently optimise
cdef list l = [...]
l.sort()
into a call to PyList_Sort(), as this would break calls like
l.sort(key=...)
My suggestion is to remove the current support for optimised methods of
builtins, and to write a dedicated transform that intercepts the tree on
call nodes and that can then handle all cases in explicit code. This can
include, for example, adding a None check if required, or handling
different call signatures only some of which can be optimised, maybe even
by changing keyword arguments into positional arguments of a matching
C-API function.
I imagine that it would use some kind of dispatch mechanism on
(obj_type, obj_attribute_name)
and on builtin function names. I also think that the current generic
"X.append()" optimisation (i.e. not only the one for typed lists) should
go there.
This might(!) depend on (or at least benefit from) splitting up the type
analysis phase (as discussed before, looks like we still need a ticket for
this), so that we can recognise the declared/builtin names when running
the transform, and can handle the final return values appropriately (which
are sometimes boolean ints instead of (None) Python objects, for example)
*after* switching to the corresponding C-API function.
Opinions?
Stefan
More information about the Cython-dev
mailing list