Python 在Cython中按名称调用cdef函数

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

我在Cython中有一组
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
之间不会有太大的差异)。