它介于两者之间。它不受支持,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]
为什么需要在函数调用之外分配静态数组?