python - 我可以强制 python 数组元素具有特定大小吗?

标签 python arrays numpy

我正在使用数组模块来存储数量可观(许多千兆字节)的无符号 32 位整数。 python 没有为每个元素使用 4 个字节,而是使用 8 个字节,如 array.itemsize 所示,并由 pympler 验证。

例如:

>>> array("L", range(10)).itemsize
8

我有大量元素,所以将它们存储在 4 个字节以内对我有好处。

Numpy 将允许我将值存储为无符号 32 位整数:

>>> np.array(range(10), dtype = np.uint32).itemsize
4

但问题是使用 numpy 的索引运算符的任何操作都大约慢两倍,因此 numpy 不支持的向量操作的操作速度很慢。 例如:

python3 -m timeit -s "from array import array; a = array('L', range(1000))" "for i in range(len(a)): a[i]"
10000 loops, best of 3: 51.4 usec per loop

对比

python3 -m timeit -s "import numpy as np; a = np.array(range(1000), dtype = np.uint32)" "for i in range(len(a)): a[i]"
10000 loops, best of 3: 90.4 usec per loop

所以我被迫要么使用两倍于我想要的内存,要么程序运行速度比我想要的慢两倍。有没有解决的办法?我可以强制 python 数组使用指定的项目大小吗?

最佳答案

如果你想坚持使用数组set the typecode I (unsigned int) 而不是 L (unsigned long):

>>> array.array("I", range(10)).itemsize
4

也就是说,如果没有一种方法可以使您的计算速度比使用 numpy 损失的速度快 2 倍以上,我会感到非常惊讶。如果不知道您用这些值做了什么,很难说清楚。

关于python - 我可以强制 python 数组元素具有特定大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36832450/

相关文章:

python - 列之间的减法操作以在数据框中创建新列

python - 单元格pyqt中的小部件对齐

jquery - 是否可以使用 'div id' 作为数组名称?

Python/Numba : Unknown attribute error with scipy. special.gammainc()

python - 用Python计算自相关函数

python - 删除列中的重复字符

android - SQLite 数据库或 XML string[] 哪个内存效率更高?

java - 以反向方式打印数组的元素,但只会打印一个元素

Python:交叉索引numpy数组

python - 为什么非默认参数不能跟随默认参数?