python 3 problem: how to convert an extension method into a classMethod

R

Robin Becker

In python 2 I was able to improve speed of reportlab using a C extension to
optimize some heavily used methods.

so I was able to do this


class A:
.....
def method(self,...):
....


try:
from extension import c_method
import new
A.method = new.instancemethod(c_method,None,A)
except:
pass

and if the try succeeds our method is bound as a class method ie is unbound and
works fine when I call it.

In python 3 this doesn't seem to work at all. In fact the new module is gone.
The types.MethodType stuff doesn't seem to work.

Is there a way in Python 3.3 to make this happen? This particular method is
short, but is called many times so adding python wrapping layers is not a good
way forward.

If the above cannot be made to work (another great victory for Python 3) then is
there a way to bind an external method to the instance without incurring too
much overhead.

Alternatively could it make sense to implement an accelerated basetype that just
contains the accelerated methods of class A. I could then imagine doing
something like

try:
from extension import class c_baseA as baseA
except:
class baseA:
def method(....)

class A(baseA):
.....

presumably I then get some kind of penalty for the base class lookup, but how
bad is that?
 
S

Steven D'Aprano

In python 2 I was able to improve speed of reportlab using a C extension
to optimize some heavily used methods.

so I was able to do this


class A:
.....
def method(self,...):
....


try:
from extension import c_method
import new
A.method = new.instancemethod(c_method,None,A)
except:
pass

Why are you suppressing and ignoring arbitrary errors here? That doesn't
sound good. Surely a better way would be:

import new
try:
from extension import c_method
except ImportError:
pass
else:
A.method = new.instancemethod(c_method, None, A)


and if the try succeeds our method is bound as a class method ie is
unbound and works fine when I call it.

In python 3 this doesn't seem to work at all. In fact the new module is
gone. The types.MethodType stuff doesn't seem to work.

I've never tried this with a function written in C, but for one written
in Python all you need is this:

A.method = c_method


Try that and see if it works with your function written in C. I expect
that it will, provided that the function is written as a method
descriptor. I don't know enough about C extensions to tell you how to do
that, sorry.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,149
Members
46,695
Latest member
StanleyDri

Latest Threads

Top