Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #39976 > unrolled thread

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

Started byRobin Becker <robin@reportlab.com>
First post2013-02-26 17:21 +0000
Last post2013-02-27 04:46 +0000
Articles 2 — 2 participants

Back to article view | Back to comp.lang.python


Contents

  python 3 problem: how to convert an extension method into a class Method Robin Becker <robin@reportlab.com> - 2013-02-26 17:21 +0000
    Re: python 3 problem: how to convert an extension method into a class Method Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-02-27 04:46 +0000

#39976 — python 3 problem: how to convert an extension method into a class Method

FromRobin Becker <robin@reportlab.com>
Date2013-02-26 17:21 +0000
Subjectpython 3 problem: how to convert an extension method into a class Method
Message-ID<mailman.2558.1361899289.2939.python-list@python.org>
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?
-- 
Robin Becker

[toc] | [next] | [standalone]


#40031

FromSteven D'Aprano <steve+comp.lang.python@pearwood.info>
Date2013-02-27 04:46 +0000
Message-ID<512d8f8c$0$30001$c3e8da3$5496439d@news.astraweb.com>
In reply to#39976
On Tue, 26 Feb 2013 17:21:16 +0000, Robin Becker wrote:

> 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.



-- 
Steven

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web