cdef double f[500][500]
这是声明一个由500个double组成的500个C数组的C数组。那是500 *500压缩后的双精度值(在这种情况下,除非Cython进行一些时髦的操作,否则存储在堆栈上)没有任何间接访问,这有助于提高性能和缓存利用率,但显然增加了严格的限制。也许您想这样做,但是您应该学习足够的C知识,然后才知道这意味着什么。顺便说一句,一个限制是该大小必须是一个编译时常数(取决于C版本;
C99和C10允许它),这就是第一个错误消息的含义。
如果确实使用数组,则不会初始化
f方法,因为这没有任何意义。
f已经是500x500的双变量,并且不能将数组作为一个整体分配给它(后者是错误消息试图告诉您的内容)。特别是,列表理解会创建一个成熟的Python列表对象(您也可以从Cython中使用,请参见下文),其中包含成熟的“盒装”
Python对象(
float在这种情况下为对象)。列表与C数组不兼容。使用
for带有项目分配的嵌套循环进行初始化。最后,这样的数组需要500 *500 * 8字节,几乎是2 MiB。在某些系统上,它比整个堆栈大,而在所有其他系统上,它占堆栈的很大部分,这是一个坏主意。
如果您使用Python列表,请注意,尽管您可能会获得一些便利,但是在性能和内存使用方面不会有太大改善(假设您的代码将主要在操纵该列表)。您可以不使用
cdef,也可以将其
list用作类型(
object应该也可以使用,但是您从中不会得到任何好处,因此也可以忽略它)。
NumPy数组可能更快,内存效率更高 并且
使用起来更方便。如果你能实现与NumPy的操作方面的算法的性能关键部分,你可能会获得所需的加速,而不使用用Cython 可言 。



