PyPy和高效数组

3

我的项目目前仅使用 NumPy 用于内存高效的数组(bool_、uint8、uint16 和 uint32)。

我想在不支持 NumPy 的 PyPy 上运行它。(无法安装它,无论如何)

因此,我想知道:是否有其他内存高效的方法来在 Python 中存储数字数组?任何 PyPy 支持的方法?PyPy 是否具有自己的方法?

注意:array.array 不是可行的解决方案,因为在我的测试中它比 NumPy 使用更多的内存。


5
PyPy附带了numpypy(它是numpy的一个克隆品,但仍然缺少某些功能)。 - JBernardo
2
还有一个问题必须要问,那就是为什么你要考虑使用pypy?你是否可以先尝试其他更简单的优化方法?你当前的性能瓶颈在哪里? - John Lyon
谢谢JBernardo。numpypy对我的需求似乎很好。 :) - peu ping
关于我为什么想使用PyPy - 我有一个用Python编写的服务器应用程序,我希望它能够表现出色。我以前使用过Psyco,并发现它大大提高了性能。我可以重写部分或整个应用程序,但我不想这样做。 - peu ping
bytearray 对于 8 位数的数字来说是快速而紧凑的。 - Brent Washburne
1个回答

3

array.array是一种内存高效的数组。它将字节/单词等打包在一起,因此整个数组只有少量额外开销。

唯一可以使用更少内存的地方是当您拥有稀疏数组并且正在使用其中一种稀疏数组实现时,NumPy可以使用更少的内存。

如果您没有使用稀疏数组,则只是错误地测量了它。

array.array也没有打包的bool类型,所以您可以将其实现为array.array('I')bytearray()的包装器,甚至可以使用Python long的位掩码。


1
根据您的需求,还可以使用cffi,在其中您可以声明和使用C类型数组或小型C结构的数组。 - Armin Rigo
为了测量内存,我尝试使用随机数据初始化一个非常大的数组,并查看 Python 所使用的 RAM。我之前也在生产中使用过 array.array,并发现当我转换到 numpy 时,RAM 的使用减少了 50-70%。这些数组可能是稀疏的,在任何给定时间它们可能大约有 75% 是空的,我估计。 - peu ping

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接