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吗?
如果您想坚持使用array,请将typecode设置为I(unsigned int)而不是L(unsigned long):
>>> array.array("I", range(10)).itemsize
4
Run Code Online (Sandbox Code Playgroud)
也就是说,如果没有办法加速你的计算方式超过你使用numpy输掉的2倍,我会感到非常惊讶.很难说不知道你对这些价值做了什么.