NumPy ndarray.all()vs np.all(ndarray)vs all(ndarray)

时间:2017-04-13 01:47:01

标签: python performance numpy

三个"所有"之间的区别是什么? Python / NumPy中的方法?性能差异的原因是什么? ndarray.all()总是三者中最快的吗?

这是我跑的时间测试:

In [59]: a = np.full(100000, True, dtype=bool)

In [60]: timeit a.all()
The slowest run took 5.40 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.24 µs per loop

In [61]: timeit all(a)
1000 loops, best of 3: 1.34 ms per loop

In [62]: timeit np.all(a)
The slowest run took 5.54 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 6.41 µs per loop

3 个答案:

答案 0 :(得分:6)

np.all(a)a.all()之间的区别很简单:

  • 如果anumpy.array,则np.all()只会致电a.all()
  • 如果a不是numpy.array,则np.all()来电会将其转换为numpy.array,然后致电a.all()。另一方面,a.all()会失败,因为a不是numpy.array,因此可能没有all方法。

np.allall之间的差异更为复杂。

  • all函数适用于任何可迭代(包括listsetgenerators,...)。 np.all仅适用于numpy.array s(包括可转换为numpy数组的所有内容,即listtuple s。
  • np.all处理具有指定数据类型的array,这使得它在比较!= 0时非常有效。然而,all需要为每个项目评估bool,这要慢得多。
  • 使用python函数处理数组非常慢,因为数组中的每个项都需要转换为python对象。 np.all不需要进行转换。

请注意,时间也取决于a的类型。如果你处理一个python列表all对于相对较短的列表可以更快。如果你处理一个数组,np.alla.all()几乎在所有情况下都会更快(除了object数组之外,但我不会走那条路,那就是疯狂)

答案 1 :(得分:1)

我会在这个

  • np.all是一个通用函数,可以使用不同的数据类型,这可能会查找ndarray.all,这就是为什么它稍慢。

  • all是一个python bulit-in函数,请参阅https://docs.python.org/2/library/functions.html#all

  • ndarray.all是'numpy.ndarray'对象的方法,直接调用它可能会更快。

答案 2 :(得分:0)

我怀疑numpy的函数更多地将数组元素作为布尔值进行评估,可能采用一些通用的数字优先方式,而内置all()什么都不做,因为元素已经是布尔值。

我想知道浮点数的整数结果会有多么不同。