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

Peter Otten __peter__ at web.de
Tue Feb 26 21:26:24 CET 2013


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?





More information about the Python-list mailing list