Numpy数组与Python数组

nor*_*ok2 5 python arrays numpy

我注意到,Python中数组操作的事实上的标准是通过出色的numpy库实现的。但是,我知道Python标准库有一个array模块,在我看来,它的使用案例与Numpy类似。

在现实世界中,是否有任何array理想的例子比numpy普通的理想list

根据我的幼稚解释,array它只是用于存储同类数据的高效内存的容器,但却无法提高计算效率。


编辑

出于好奇,我搜索了Github,发现import arrayPython命中186'721,而import numpy命中8'062'678。

但是,我找不到使用的流行存储库array

nor*_*ok2 6

要理解之间的区别numpyarray,我跑了几个定量测试。

我发现的是,对于我的系统(Ubuntu 18.04,Python3),arrayrange生成器生成大型数组的速度似乎是numpy(虽然numpy的专用np.arange()速度要快得多-实际上太快了,并且可能是在测试期间缓存了一些东西),但速度是使用的两倍list

但是,非常令人惊讶的是array对象似乎比numpy对应对象大。相反,list对象大约比array对象大8-13%(显然,这将随单个项目的大小而变化)。与相比listarray提供了一种控制数字对象大小的方法。

因此,也许唯一明智的用例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()
Run Code Online (Sandbox Code Playgroud)

对象大小图