0

我在试图移植到 Cython 的 c++ 文件中定义了一个静态双精度数组。

我遵循了Can I create a static C array with Cython 的建议?使用硬编码的系数数组,因为如果有任何方法可以避免它,我不想索引一个列表(非常性能敏感的代码段,所以速度非常重要)。否则我可以只使用一个列表或类似的东西。代码很简单,但是太慢了。

我的数组代码实现(在 .PXD 文件中)看起来像

cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]

当我像 a_radial[0] 那样引用数组的元素(在纯 python 模式 .py 文件中)时,我遇到了崩溃并且没有产生异常。这是一个错误吗?还是我在做一些愚蠢的事情?

谢谢,伊恩

4

1 回答 1

0

它介于两者之间。它不受支持,Cython 人知道它。

http://trac.cython.org/cython_trac/ticket/113

我尝试了两种不同的方法:

cdef get_list():
    cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
    return a_radial

def get_list():
    cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
    return a_radial

两次都无法正确编译。它似乎真的不受支持。

我能够强制 Cython 允许我创建一个静态数组,但只能在方法调用内部。这让我觉得他们知道在这些情况下(堆栈)将数组放在哪里,但在模块级别,它会放在哪里?堆?分配它的机制是什么?此外,如果您想以纯 python 模式访问数组,则需要将其转换为 python 可以理解的内容,并且它不理解 C 数组。您只能返回 Python 对象或 Cython 可以自动转换为 Python 对象的东西。

如果性能是一个问题,那么将其保留在 C 模式代码中应该不是问题。如果你需要让它进入 python 模式,那么在一个地方声明一个静态数组和一个 python 列表有什么问题。它们可以分开,以便于更新。

cdef class Fun:
    a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
    def do_calcs(self):
        cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
        print a_radial[0]

你不能把所有对性能敏感的东西都包装到一个 python 方法调用中吗?我还能够在单个函数中找到静态数组:

def do_calcs():
    cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
    print a_radial[0]

为什么需要在函数调用之外分配静态数组?

于 2012-12-11T22:35:56.627 回答