栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Cython中声明2D列表

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Cython中声明2D列表

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 可言



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625988.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号