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

Pau*_*aul 6 python arrays numpy

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

例如:

>>> array("L", range(10)).itemsize
8
Run Code Online (Sandbox Code Playgroud)

我有很多元素,所以我可以将它们存储在4个字节内.

Numpy会让我将这些值存储为无符号32位整数:

>>> np.array(range(10), dtype = np.uint32).itemsize
4
Run Code Online (Sandbox Code Playgroud)

但问题是使用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
Run Code Online (Sandbox Code Playgroud)

VS

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
Run Code Online (Sandbox Code Playgroud)

所以我被迫使用两倍于我想要的内存,或者程序运行速度是我想要的两倍.有没有解决的办法?我可以强制python数组使用指定的itemsize吗?

Jai*_*ime 5

如果您想坚持使用array,请将typecode设置I(unsigned int)而不是L(unsigned long):

>>> array.array("I", range(10)).itemsize
4
Run Code Online (Sandbox Code Playgroud)

也就是说,如果没有办法加速你的计算方式超过你使用numpy输掉的2倍,我会感到非常惊讶.很难说不知道你对这些价值做了什么.