【问题标题】:Cython return tuple within cdef?Cython在cdef中返回元组?
【发布时间】:2017-09-22 07:43:19
【问题描述】:

您好,我正在尝试将 python 代码转换为 cython 以加快其计算速度。我试图在 cython 代码中从cdefcpdef 返回多个数组。基于经典 C,我可以使用指针或元组。我决定使用元组,因为大小不同。我知道下面的代码不起作用,有什么帮助吗?谢谢!

import numpy as np
cimport numpy as np

cdef tuple funA(double[:] X, double[:] Y): 
    cdef int nX, nY, i
    nX = len(X)
    nY = len(Y)

    for i in range(nX):
        X[i] = X[i]*X[i]

    for i in range(nY):
        Y[i] = Y[i]*Y[i]

    return X,Y

cpdef Run(double[:] X, double[:] Y)
    cdef Tuple1, Tuple2 = funA(X,Y)

    # Do some calculation with Tuple1 and Tuple2 
    # Example

    cdef int i, nTuple1, nTuple2

    nTuple1 = len(Tuple1)    
    for i in range(nTuple1):
        Tuple1[i] = Tuple1[i]**2

    nTuple2 = len(Tuple2)
    for i in range(nTuple2):
        Tuple2[i] = Tuple2[i]/2

    return Tuple1, Tuple2

【问题讨论】:

    标签: cython


    【解决方案1】:

    您有一些缩进错误和缺少冒号。但你真正的问题是:

    cdef Tuple1, Tuple2 = funA(X,Y)
    

    删除cdef 就可以了。它看起来不像 cdef 和元组解包非常混合,因为您将它们视为 Python 对象,所以应该没问题。

    但是,请注意,您实际上不需要从 funA 返回任何内容,因为您在那里修改了 XY

    【讨论】:

    • 我按照你的建议删除了 cdef,我得到一个“预期的标识符或文字”。你能给我一个例子,在 cpdef Run 中你调用一个返回 2 个数组的函数 funA 吗?谢谢!
    • 我认为那是因为您在上一行缺少一个冒号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2018-03-12
    相关资源
    最近更新 更多