我注意到 Python 中数组操作的事实上标准是通过出色的 numpy
库实现的。但是,我知道 Python 标准库有一个 array
模块,在我看来,它的用例与 Numpy 类似。
是否有任何真实世界的例子,其中 array
优于 numpy
或只是普通的 list
?
根据我天真的解释,array
只是同类数据的内存高效容器,但没有提供提高计算效率的方法。
编辑
出于好奇,我在 Github 和 import array
中搜索了 Python 命中 186'721 个计数,而 import numpy
命中了 8'062'678 个计数。
但是,我找不到使用array
的流行存储库。
为了理解 numpy
和 array
之间的区别,我进行了更多的定量测试。
我发现,对于我的系统(Ubuntu 18.04、Python3),array
从 range
生成器生成大型数组的速度似乎是原来的两倍与 numpy
相比(尽管 numpy
的专用 np.arange()
似乎快得多——实际上太快了,也许它是在测试期间缓存一些东西),但比使用 list
慢两倍。
但是,非常令人惊讶,array
对象似乎比 numpy
对象更大。
相反,list
对象大约比 array
对象大 8-13%(这显然会随着单个项目的大小而变化)。
与 list
相比,array
提供了一种控制数字对象大小的方法。
因此,也许 array
唯一合理的用例实际上是当 numpy
不可用时。
为了完整性,这里是我用于测试的代码:
import numpy as np
import array
import sys
num = int(1e6)
num_i = 100
x = np.logspace(1, int(np.log10(num)), num_i).astype(int)
%timeit list(range(num))
# 10 loops, best of 3: 32.8 ms per loop
%timeit array.array('l', range(num))
# 10 loops, best of 3: 86.3 ms per loop
%timeit np.array(range(num), dtype=np.int64)
# 10 loops, best of 3: 180 ms per loop
%timeit np.arange(num, dtype=np.int64)
# 1000 loops, best of 3: 809 µs per loop
y_list = np.array([sys.getsizeof(list(range(x_i))) for x_i in x])
y_array = np.array([sys.getsizeof(array.array('l', range(x_i))) for x_i in x])
y_np = np.array([sys.getsizeof(np.array(range(x_i), dtype=np.int64)) for x_i in x])
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(x, y_list, label='list')
plt.plot(x, y_array, label='array')
plt.plot(x, y_np, label='numpy')
plt.legend()
plt.show()