Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用作为函数的属性对Python类进行Cythonize?_Python_Python 3.x_Cython - Fatal编程技术网

如何使用作为函数的属性对Python类进行Cythonize?

如何使用作为函数的属性对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

我正在和托比·塞加兰的基因编程集体智能代码一起工作,我想用Cython来加速它。我开始意识到,对于第一次Cython项目,我可能吃得太多了。我在谷歌上搜索了一个如何让它工作的答案,但似乎找不到正确的例子组合

以下是所讨论的实际代码:

# 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的复制品。。。大概看起来很像我包含的不适合我的链接。但这似乎更接近。我今晚会试试,然后再给你回复。