[Python-Dev] Idea for a fast calling convention
Michael Hudson
mwh at python.net
Sat Feb 28 12:47:14 EST 2004
"Phillip J. Eby" <pje at telecommunity.com> writes:
> At 12:39 PM 2/28/04 +0000, Michael Hudson wrote:
>>"Phillip J. Eby" <pje at telecommunity.com> writes:
>>
>> > Maybe there should instead be a tp_call_stack slot. Then the various
>> > CALL opcodes would call that slot instead of tp_call. C API calls
>> > would still go through tp_call.
>>
>>People *really* should look at the patch I mentioned...
>
> Ah, I see you've implemented this already. :)
:-)
>> > In practice, though, I expect it would be faster to do as Jython and
>> > IronPython have done, and define a set of tp_call1, tp_call2,
>> > etc. slots that are optimized for specific calling situations,
>> > allowing C API calls to be sped up as well, provided you used things
>> > like PyObject_Call1(ob,arg), PyObject_Call2(ob,arg1,arg2), and so on.
>>
>>I think this only really helps when you have a JIT compiler of some
>>sort?
>
> No, all you need is a mechanism similar to the one in your patch,
> where the creation of a method or function object includes the
> selecting of a function pointer for each of the call signatures. So,
> when creating these objects, you'd select a call0 pointer, a call1
> pointer, and so on. If the function requires more arguments than
> provided for that slot, you just point it to an "insufficient args"
> version of the function. If the function has defaults that would be
> filled in, you point it to a version that fills in the defaults, and
> so on.
Well, this is psyco-style code explosion by hand :-) Doesn't sound
like fun.
Incidentally, I think it would be goodness if PyCFunctions exposed
more info about the arguments they take.
> So, there's not a JIT required, but making the patch could be tedious,
> repetitive and error prone. Macros could possibly help a bit with the
> repetition and tedium, although not necessarily the error-prone part.
> :)
It probably wouldn't be seriously hard to write a program writing
program for this.
>> > Perhaps there is some information that can be gleaned from the Jython
>> > research as to what are the most common number of positional
>> > parameters for calls.
>>
>>That's easy: 0 then 1 then 2 then 3 then insignificant.
>
> Actually, I'd find that a bit surprising, as I would expect 1-arg
> calls to be more popular than 0-argument calls. But I guess if you
> look at a method call, it could be a 0-argument call to the method,
> that maps to a 1-argument call on the function. But, I guess that
> would at any rate put 0-argument calls in the running.
Well, it was just a guess. Maybe METH_O is more common.
> Anyway, I guess a 0-argument call for an instancemethod would look
> something like:
Actually, this isn't much how things work now.
> PyObject *
> method_call0(PyObject *self) {
> if (self->im_self) {
> return PyObject_Call1(self->im_func, self->im_self);
> } else {
> return PyObject_Call0(self->im_func);
> }
> }
but, yes.
> And then you'd repeat this pattern for call1 and call2, but call3
> would have to fall back to creating an argument tuple if we're only
> going up to call3 slots.
>
> Interestingly, the patterns involved in making these functions are
> basically left currying (methods) and right currying (default args).
> It may be that there's some way to generalize this, perhaps by using
> wrapping objects. On the other hand, that would tend to go against
> the intended speedup.
I don't think this approach is going to yield mega speedups whatever.
We need Pysco or similar tech for that, I think.
>> ARTHUR: Don't ask me how it works or I'll start to whimper.
>> -- The Hitch-Hikers Guide to the Galaxy, Episode 11
>
> Heh. Did you pick this quote intentionally? :)
No, but that quote applies to a worrying fraction of my posts...
Cheers,
mwh
--
Or here's an even simpler indicator of how much C++ sucks: Print
out the C++ Public Review Document. Have someone hold it about
three feet above your head and then drop it. Thus you will be
enlightened. -- Thant Tessman
More information about the Python-Dev
mailing list