[Cython] Speedup module-level lookup
Vitja Makarov
vitja.makarov at gmail.com
Thu Jan 19 08:49:51 CET 2012
2012/1/19 Robert Bradshaw <robertwb at math.washington.edu>:
> I think the right thing to do here is make all module-level globals
> into "cdef public" attributes, i.e. C globals with getters and setters
> for Python space. I'm not sure whether this would best be done by
> creating a custom dict or module subclass, but it would probably be
> cleaner and afford much more than a 1.6x speedup.
>
> - Robert
>
> On Wed, Jan 18, 2012 at 12:30 PM, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>> I tried to optimize module lookups (__pyx_m) by caching internal PyDict state.
>>
>> In this example bar() is 1.6 time faster (500us against 842us):
>>
>> C = 123
>> def foo(a):
>> return C * adef bar():
>> for i in range(10000): foo(i)
>> Here is proof of
>> concept:https://github.com/vitek/cython/commit/1d134fe54a74e6fc6d39d09973db499680b2a8d9
>>
>> So the question is: does it worth it?
>>
Yes, nice idea.
It's possible to subclass PyModuleObject and I didn't find any use of
PyModule_CheckExact() in CPython's sources:
import types
import sys
global_foo = 1234
class CustomModule(types.ModuleType):
def __init__(self, name):
types.ModuleType.__init__(self, name)
sys.modules[name] = self
@property
def foo(self):
return global_foo
@foo.setter
def foo(self, value):
global global_foo
global_foo = value
CustomModule('foo')
import foo
print foo.foo
--
vitja.
More information about the cython-devel
mailing list