[Cython] PEP 3135 -- New Super

Stefan Behnel stefan_ml at behnel.de
Fri Jul 22 07:58:26 CEST 2011


Vitja Makarov, 21.07.2011 20:57:
> 2011/7/21 Stefan Behnel<stefan_ml at behnel.de>:
>> Robert Bradshaw, 21.07.2011 11:21:
>>>
>>> On Thu, Jul 7, 2011 at 2:13 PM, Vitja Makarov wrote:
>>>>
>>>> 2011/7/8 mark florisson
>>>>>
>>>>> In descr_get you create and return a new CyFunction with a __self__
>>>>> set (note, not m_self) and in __call__ you put __self__ in the args
>>>>> tuple and the function as m_self, and then call the CyFunction using
>>>>> PyCFunction_Call. But copying and modifying PyCFunction_Call works
>>>>> just as well I suppose :)
>>>>
>>>> Yes, that would work) But I think CyFunction is too heavy for methods.
>>>> I've just realized that descr_get is called each time you access method,
>>>> each time you call it and so on.
>>>
>>> True, but this is also the case for CPython methods and method
>>> descriptors. There's also an inefficiency in calling bound methods in
>>> that a new tuple needs to be created with the bound parameter as the
>>> first component. Perhaps we could do away with that as well with
>>> specialized unpacking code. It would simultaneously be a step forward
>>> and backwards in terms of compatibility, but we could do away with
>>> ever generating PyCFunctions, methods, and method descriptors.
>>
>
> Yeah, I was thinking about that too.
>
>> That sounds like a really cool optimisation path. We could get rid of one
>> indirection by replacing tp_call (originally PyCFunction_Call) directly by
>> the real function entry point, i.e. the Python function wrapper (assuming
>> the DefNode refactoring has taken place by then).
>>
>
> +1 I think DefNode refactoring should be done first (Did we froget about that?)
>
>> It would also (somewhat) simplify the argument unpacking code, as that would
>> no longer have to care about the METH_O and METH_NOARGS special cases.
>> They'd be handled naturally inside of the Python call wrapper.
>>
>>
>>> Perhaps
>>> a CEP is in order to nail down the behavior of the CyFunction object.
>>
>> +1, totally helps in figuring out the details.
>
> CEP for refactored DefNode would be a good idea too.

Well, there's still the part I wrote for the generator CEP:

http://wiki.cython.org/enhancements/generators#Pythonfunctionrefactoring


> As I rember the idea is to turn def node into cdef node with wrapper
> call function just like cpdef buf without C-level access.
> So here we have to decide how to how to match python function's
> signature and cdef one.

I think that's mostly trivial - the argument unpacking code already does 
the mapping for us.

Stefan


More information about the cython-devel mailing list