【发布时间】:2013-02-05 04:38:04
【问题描述】:
我正在尝试编译这种代码:
def my_func(double c, int m):
cdef double f[m][m]
f = [[c for x in range(m)] for y in range(m)]
...
引发:
Error compiling Cython file:
------------------------------------------------------------
def grow(double alpha, double beta, double gamma, int m, int s):
cdef double f[m][m]
^
------------------------------------------------------------
test.pyx:6:22: Not allowed in a constant expression
之后我假设我不能在指定的地方使用变量,我尝试使用数值:
def my_func(double c, int m):
cdef double f[500][500]
f = [[c for x in range(500)] for y in range(500)]
...
然后我得到:
Error compiling Cython file:
------------------------------------------------------------
f = [[beta for x in range(500)] for y in range(500)]
^
------------------------------------------------------------
test.pyx:13:6: Assignment to non-lvalue 'f'
所以,我想知道如何在 cython 代码中声明和制作 2D 列表。我在谷歌搜索“cython 2D list”的文档中找不到这种示例
【问题讨论】:
-
好吧,如果我离开声明,我会得到编译的代码,所以我想我的声明是错误的
-
你真的想要一个列表列表,还是一个二维 C 数组?
-
是的,就像写的一样。我正在尝试加速非常慢的 Python 代码,该代码循环遍历此(以及另外两个)列表的每个元素。想象一下这有多慢。
-
这是一个非此即彼的问题。您声明了一个 2d C 数组,但使用 Python 列表来初始化
f,所以我试图找出您是否混淆了两者(或者甚至不知道差异,正如您的语言所指示的那样)或想要一个特定的一个,只是使用了错误的语法。 -
是的,学习 Cython :) 在文档中我看到了对象,在我看来是 Python 列表,声明为
p[1000],所以我想我应该这样声明列表。我应该尝试声明还是不需要声明列表?我在这里看到了这个例子:docs.cython.org/src/userguide/tutorial.html#primes