我有一个在内部循环中调用的函数,所以我想使用Cython加快速度。
在.pxd
文件中添加类型提示会有所帮助,但是用一点C魔术代替实现会更有用,所以我尝试在pxd文件中定义该函数然后将其替换:
# test.py
import cython
def foo_():
print('Hello world')
if not cython.compiled:
foo = foo_
# test.pxd
# What I want:
# @cython.skipdefinition
# foo()
cdef inline void foo():
print('Hello world from Cython')
而且,当然会失败:test.py:7:4: Assignment to non-lvalue 'foo'
,因为C不允许分配给函数。
是否有办法替换pxd
文件中的现有Python函数?
至少有两个选择:
如果不需要在多个模块之间共享cdef
功能,则可以将整个内容放在.py文件中,而不使用.pxd文件。 @cython.inline
装饰器在这里为您提供帮助:
import cython
@cython.cfunc
@cython.inline
def foo():
if cython.compiled:
print("Hello world from Cython")
else:
print("Hello world")
如果do需要.pxd文件中的定义才能在多个模块之间共享它,那么您需要更改分配。将纯Python版本写入模块globals()
dict中:
# ... other code as you wrote it ...
if not cython.compiled:
globals()['foo'] = foo_
从Cython的角度来看,这并不覆盖C名称,所以很好。
由于意图更明确,我尽可能选择选项1。