如何使用作为函数的属性对Python类进行Cythonize?
我正在和托比·塞加兰的基因编程集体智能代码一起工作,我想用Cython来加速它。我开始意识到,对于第一次Cython项目,我可能吃得太多了。我在谷歌上搜索了一个如何让它工作的答案,但似乎找不到正确的例子组合 以下是所讨论的实际代码:如何使用作为函数的属性对Python类进行Cythonize?,python,python-3.x,cython,Python,Python 3.x,Cython,我正在和托比·塞加兰的基因编程集体智能代码一起工作,我想用Cython来加速它。我开始意识到,对于第一次Cython项目,我可能吃得太多了。我在谷歌上搜索了一个如何让它工作的答案,但似乎找不到正确的例子组合 以下是所讨论的实际代码: # Function Wrapper Code class fwrapper: def __init__(self, funct, params, name): self.function = funct self.para
# Function Wrapper Code
class fwrapper:
def __init__(self, funct, params, name):
self.function = funct
self.params = params
self.name = name
# Functions with 2 parameters
addw = fwrapper(lambda p: p[0] + p[1], 2, 'add')
subw = fwrapper(lambda p: p[0] - p[1], 2, 'subtract')
mulw = fwrapper(lambda p: p[0] * p[1], 2, 'multiply')
# If and > Function
def iffunc(l):
if l[0] > 0:
return l[1]
else:
return l[2]
ifw = fwrapper(iffunc, 3, 'if')
def isgreater(l):
if l[0] > l[1]:
return 1
else:
return 0
gtw = fwrapper(isgreater, 2, 'isgreater')
# List of possible functions
flist = [addw, mulw, ifw, gtw, subw]
因此,因为Toby使用Python类作为他在遗传编程算法中使用的函数的包装器,所以我必须首先“Cythonize”(我不是指实际的Cythonize调用)类本身。但是函数包装器类传入一个函数。更糟糕的是,传入的函数需要一个Python列表参数
因此,在Cython中尝试加快这一速度是有问题的,因为它需要一些我似乎无法理解的高级主题
第一个问题:我不知道如何将c风格的函数传递到这个类的“cythonized”版本中。此解决方案可以工作,但速度不快,因为它仍然将我传入的函数视为一个缓慢的python函数:
# Function Wrapper Code
cdef class fwrapper:
cdef public object function
cdef public int params
cdef public object name
def __init__(self, funct, int params, name):
self.function = funct
self.params = params
self.name = name
# Functions with 2 parameters
cdef add(double param1, double param2):
return param1 + param2
addw = fwrapper(add, 2, 'add')
cdef subtract(double param1, double param2):
return param1 - param2
subw = fwrapper(subtract, 2, 'subtract')
cdef multiply(double param1, double param2):
return param1 * param2
mulw = fwrapper(multiply, 2, 'multiply')
# If and > Function - 3 parameter functions
cdef iffunc(double param1, double param2, double param3):
if param1 > 0:
return param2
else:
return param3
ifw = fwrapper(iffunc, 3, 'if')
cdef isgreater(double param1, double param2):
if param1 > param2:
return 1
else:
return 0
gtw = fwrapper(isgreater, 2, 'isgreater')
# List of possible functions
flist = [addw, mulw, ifw, gtw, subw]
我试过玩ctypedef,但没用。这可能是正确的答案,但遵循此链接()似乎并不正确 可能重复的问题我将很快更新我的问题,使其不再重复该问题。我确实发现我可以将它声明为一个对象,它会工作,但不会加速。所以仍然在寻找关于如何传递c函数的答案。好的,现在的问题不是你添加的链接的重复。但我看不出有什么办法可以移除它。可能是Hmmm的复制品。。。大概看起来很像我包含的不适合我的链接。但这似乎更接近。今晚我会尝试一下,然后再给你回复。可能是重复的问题。我将很快更新我的问题,使之不再重复那个问题。我确实发现我可以将它声明为一个对象,它会工作,但不会加速。所以仍然在寻找关于如何传递c函数的答案。好的,现在的问题不是你添加的链接的重复。但我看不出有什么办法可以移除它。可能是Hmmm的复制品。。。大概看起来很像我包含的不适合我的链接。但这似乎更接近。我今晚会试试,然后再给你回复。