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'

--
Cheers.

Mark Lawrence

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to