我注意到Python中数组操作的事实标准是通过优秀的numpy
库实现的。然而,我知道Python Standard Library有一个array
模块,在我看来,它的用例与Numpy相似。
是否有任何实际的示例表明,相对于numpy
list
**?**或普通list
**?**,更适合使用
根据我天真的解释,array
只是同构数据的内存高效容器,但没有提供提高计算效率的方法。
编辑
出于好奇,我在Github和import array
上搜索Python点击了186'721次,而import numpy
点击了8'062'678次。
但是,我找不到使用array
的流行存储库。
发布于 2018-07-12 03:52:53
为了理解numpy
和array
之间的区别,我又做了一些定量测试。
我发现,对于我的系统(Ubuntu18.04,Python3),与numpy
相比,array
从range
生成器生成大型数组的速度似乎快了一倍(尽管numpy
的专用np.arange()
似乎快得多--实际上太快了,而且可能在测试期间缓存了一些东西),但比使用list
慢两倍。
然而,令人惊讶的是,的,array
对象似乎比numpy
的对等物要大。相反,list
对象大约比array
对象大8-13% (显然,这将随单个项目的大小而变化)。与list
相比,array
提供了一种控制number对象大小的方法。
因此,当numpy
不可用时,可能是array
唯一合理的用例。
为了完整起见,下面是我用于测试的代码:
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()
发布于 2018-07-12 01:01:50
是的,如果你不想在你的代码中有另一个依赖的话。
发布于 2018-07-12 04:56:50
你的意思是2018年或2002年的真实世界的例子?NumPy最初是作为Python的一个扩展,而不是作为核心库的一部分。因此,这就是为什么它是这样的,而不是因为任何性能权衡。
https://scipy.github.io/old-wiki/pages/History_of_SciPy.html
你似乎在问一个更一般的问题的特定版本。也许如果你从更广泛的角度考虑,你会发现你的问题可能没有多大用处。存在特定的模块来提供核心语言中没有的功能。如果它们更优化,拥有更多功能,或者即使它们被更多地使用,也不会令人惊讶。
这并不意味着你必须使用它们,也不意味着把它们留在里面也不是什么大问题。
我想我不明白你为什么要问这个问题,它会帮助我们给你提供一个更好的答案。
https://stackoverflow.com/questions/51290791
复制相似问题