我正在使用数组模块来存储数量可观(许多千兆字节)的无符号 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/