[Python-Dev] Re: a serious threat to 2.3's speed?
Phillip J. Eby
pje at telecommunity.com
Thu Dec 11 12:06:17 EST 2003
At 04:35 PM 12/11/03 +0000, Duncan Booth wrote:
>The way I was planning to do function calls (and had partially implemented
>it), was to have an IPyCallable interface, and a set of classes that
>implement that interface.
>
>The interface includes methods:
>
> PyObject __call__();
> PyObject __call__(PyObject arg1);
> PyObject __call__(PyObject arg1, PyObject arg2);
> PyObject __call__(PyObject arg1, PyObject arg2, PyObject arg3);
> PyObject __call__(PyObject[] args);
> PyObject __call__(PyObject[] args, PyDict keywordArgs);
>
>Concrete classes exist for functions and for bound methods taking 0, 1, 2,
>3 or more arguments. The constructor for a function object takes a
>delegate, a list of argument names and a list of defaults.
Hm. We could steal this exact same idea for use in CPython, although it'd
be tedious to implement. The current tp_call would cover the last two
cases shown, but adding a tp_call0 through tp_call3 or so might speed up a
*lot* of function calls. Specialized bytecodes for these calls would have
very short implementations. The tp_call_N slots could have default
implementations in 'object' that delegate back to the regular tp_call, so
that end-user types wouldn't need to reimplement them.
Hm. Actually, this'd be *really* tedious to implement right, because of
all the custom bound method types needed, and the C multiple wrappers for
__call__ methods written in Python. OTOH, this might be an "opportunity"
to write generic leftcurry and rightcurry functions, and use rightcurry for
default arguments...
Bleah. What this *really* seems to want is to generate a new type on the
fly, that is precisely coded to do the necessary left and right currying as
part of C-level code invocation. A JIT, in other words.
Ah well, it sounded cool at first. :)
More information about the Python-Dev
mailing list