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

Discussion in 'Python' started by Peter Otten, Feb 26, 2013.

  1. Peter Otten

    Peter Otten Guest

    Mark Lawrence wrote:

    > On 26/02/2013 18:38, Peter Otten wrote:
    >> 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
    >>>
    >>> 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.

    >>
    >> Hm, according to my random measurement your clever approach incurs more
    >> overhead than the straight-forward way that continues to work in Python
    >> 3:
    >>
    >> $ python -m timeit -s 'from new import instancemethod
    >>> from math import sqrt
    >>> class A(int): pass
    >>> A.m = instancemethod(sqrt, None, A)
    >>> a = A(42)
    >>> ' 'a.m()'

    >> 1000000 loops, best of 3: 0.5 usec per loop
    >> $ python -m timeit -s 'from math import sqrt
    >>> class A(int):
    >>> def m(self):
    >>> return sqrt(self)
    >>> a = A(42)
    >>> ' 'a.m()'

    >> 1000000 loops, best of 3: 0.473 usec per loop
    >>
    >>

    >
    > c:\Users\Mark\MyPython>python
    > Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32
    > bit (Intel)] on win32
    > Type "help", "copyright", "credits" or "license" for more information.
    > >>> import new

    > Traceback (most recent call last):
    > File "<stdin>", line 1, in <module>
    > ImportError: No module named 'new'


    I did the timing in Python 2 of course, to demonstrate that the feature the
    OP is missing in Python 3 offers no advantage in the Python version where it
    /is/ available.

    Does my previous post make sense now?
     
    Peter Otten, Feb 26, 2013
    #1
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Robin Becker
    Replies:
    1
    Views:
    138
    Steven D'Aprano
    Feb 27, 2013
  2. Dave Angel
    Replies:
    0
    Views:
    134
    Dave Angel
    Feb 26, 2013
  3. Peter Otten
    Replies:
    0
    Views:
    132
    Peter Otten
    Feb 26, 2013
  4. Mark Lawrence
    Replies:
    0
    Views:
    136
    Mark Lawrence
    Feb 26, 2013
  5. Ethan Furman
    Replies:
    0
    Views:
    161
    Ethan Furman
    Feb 26, 2013
Loading...

Share This Page