Python 在Cython中按名称调用cdef函数
我在Cython中有一组Python 在Cython中按名称调用cdef函数,python,cython,Python,Cython,我在Cython中有一组cdef函数,它们由pyx文件中的def函数调用,例如: cdef inline void myfunc_c(...): (...) return def wrapper(...): myfunc_c(...) return 这很有效。但是为了简化,不必为每个cdef函数都使用python包装器,我尝试按名称对cdef函数进行索引,方法是将它们分配给字典或类似的内容: def wrapper(operation): if ope
cdef
函数,它们由pyx
文件中的def
函数调用,例如:
cdef inline void myfunc_c(...):
(...)
return
def wrapper(...):
myfunc_c(...)
return
这很有效。但是为了简化,不必为每个cdef
函数都使用python包装器,我尝试按名称对cdef
函数进行索引,方法是将它们分配给字典或类似的内容:
def wrapper(operation):
if operation == 'my_func':
func = myfunc_c
func(...)
return
但这不起作用。Cython抱怨说它不知道myfunc\u c
的类型
是否有办法按名称索引或调用
cpdef
函数(例如,使用字符串)?我也尝试过类似于locals()['myfunc_c']
的方法,但这也不起作用。对于cdef
函数,这绝对是不可能的-它们只定义了一个c接口,而不是一个Python接口,因此没有内省可用
cpdef
函数定义Python和C接口。在函数中,它们将在globals()
中可用,而不是在locals()
中可用(因为locals()
只提供该函数中定义的变量)
我不认为你真的想这么做。我认为您只想使用
cpdef
而不是cdef
,因为这会自动为函数生成Python包装器。我以前没有使用Cython,但这似乎没有意义-为什么您能够在Python函数中调用myfunc_c,但不是在一个之外?也许我真的应该走cpdef
的路。出于性能方面的原因,我避免使用它:我确实需要在“包装器”部分中执行一些纯python操作,并且担心使用cpdef
时它不会得到充分优化。如果您担心的话,可能值得对其进行计时。值得记住的是,Cython确实编译了所有def
、cpdef
和cdef
函数,因此速度上的差异仅来自函数调用机制(而且cpdef
和cdef
之间不会有太大的差异)。