[Patches] [ python-Patches-661440 ] Refactor and streamline PyCFunction_Call

SourceForge.net noreply@sourceforge.net
Fri, 03 Jan 2003 11:57:39 -0800


Patches item #661440, was opened at 2003-01-03 03:06
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=661440&group_id=5470

Category: Core (C code)
Group: Python 2.3
Status: Open
Resolution: None
Priority: 5
Submitted By: Raymond Hettinger (rhettinger)
Assigned to: Martin v. Löwis (loewis)
Summary: Refactor and streamline PyCFunction_Call

Initial Comment:
Refactor PyCFunction_Call with an eye towards 
clarity and speed while leaving the semantics 
unchanged.  

It is now obvious which combinations of flags are 
allowed; the new structure makes it easier to add new 
flags and flag combinations; and every path runs 
faster (by having fewer jumps, filling variables only 
when and where needed, and by merging a test into 
the switch logic).

* Incorporated the keyword flag test into switch/case.
* Deferred initialization of "size" until when and where 
needed.
* Inverted error tests so that the common case has 
no jumps.



----------------------------------------------------------------------

>Comment By: Jeremy Hylton (jhylton)
Date: 2003-01-03 19:57

Message:
Logged In: YES 
user_id=31392

Sounds good to me.  The code looks clear enough.


----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-01-03 19:52

Message:
Logged In: YES 
user_id=80475

Okay, I improved the timing suite and found about a 5 to 
10% savings (suite attached as dict.diff and timemeth.py):

Case                NewTime        OldTime
--------                --------------         -------------
meth_o             10.60              11.53
meth_vargs      8.13                8.64
meth_noargs    8.08                8.90
meth_var&kw   8.07                8.46

----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-01-03 18:47

Message:
Logged In: YES 
user_id=80475

Without making dummy C functions and C caller, I can't 
get a timing suite that isolates the improvement.  The 
timing code attached below shows no change.

>From code inspection, it's easy to see the operation count 
go down.  

For meth_o, meth_noargs and meth_oldargs, it saves the 
flags&keywords step and converts a usually-fail-jump if 
into a usually-succeed-nojump. 

For meth_vargs, it saves the size lookup, the 
flags&keywords step, saves the dict-empty test, and 
converts a usually-fail-jump if into a usually-succeed-
nojump.

For the meth_keywords case, it replaces the size lookup, 
the flags&keywords step, and a usually-succeed-no-jump if 
with a single switch/case jump.  Probably, a net wash 
here.


----------------------------------------------------------------------

Comment By: Jeremy Hylton (jhylton)
Date: 2003-01-03 17:06

Message:
Logged In: YES 
user_id=31392

Do you have any measurements of the speedup?


----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-01-03 11:22

Message:
Logged In: YES 
user_id=80475

For me, the clarity comes from all allowable flag 
combinations being shown in the switch/case.

The duplication of the test for empty dictionaries and the 
computation of size are done for speed (only being done 
when and where needed).  The duplication is warranted 
only because the function is on the critical path for just 
about everything in Python and here speed really matters.

----------------------------------------------------------------------

Comment By: Martin v. Löwis (loewis)
Date: 2003-01-03 10:40

Message:
Logged In: YES 
user_id=21627

I'm uncertain why this makes the function clearer; it
appears to make it merely different, as it duplicates the
test for empty dictionaries, and the computation of the size.



----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-01-03 10:19

Message:
Logged In: YES 
user_id=80475

Should've been assigned to Martin who wrote some of the 
existing code for that function.

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=661440&group_id=5470