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