为什么在numpy数组中读取会比在dict中慢?

时间:2020-06-18 09:51:48

标签: python arrays numpy

我试图在字典和numpy数组之间进行比较。

我确定numpy数组会更快,因为当我执行numpy_array[i]时,它只需要在数组开始后检查第ith个字即可,但是执行dictionary[i]将使用哈希计算,并且使用更复杂的数据结构。

但是,我在ipython中用%timeit尝试过,字典和数组是相同的,这些是我的结果:

In [161]: def getter(obj, n): return obj[n]

In [162]: %timeit getter(dictionary, 6)
The slowest run took 10.84 times longer than the fastest. This could mean that an intermediate result is being cached.
10000000 loops, best of 3: 110 ns per loop

In [163]: %timeit getter(numpyarray, 6)
The slowest run took 27.87 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 180 ns per loop

你怎么解释呢?

1 个答案:

答案 0 :(得分:0)

要注意的一件事是,一个numpy数组具有大量记账功能,请参见ndarray attributes。您可以通过更改strides属性的值来破坏数组,只是为了好玩。

此外,如果将元素从float数组中取出,则不会获得本机Python的float,而是np.float64对象。

>>> type(np.linspace(0, 1)[0])
numpy.float64

我怀疑创建一个np.float64对象比原生Python浮点有更多的开销。至少,它具有更多的属性和方法。不过不确定。您不能在其中添加属性的普通对象。

顺便说一句,访问列表元素6的速度与dict上的访问速度差不多。