2017-04-13 165 views
4

Python/NumPy中三个“all”方法有什么区别?性能差异的原因是什么? ndarray.all()总是三者中最快的是真的吗?NumPy ndarray.all()与np.all(ndarray)vs all(ndarray)

这里是我跑一个计时测试:

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 

回答

5

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

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

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

  • all功能适用于任何可迭代(包括listset S,generators,...)。 np.all仅适用于numpy.array s(包括可转换为numpy阵列的所有内容,即list s和tuple s)。
  • np.all处理一个array与指定的数据类型,这使得它比较!= 0时非常有效。 all但是需要为每个项目评估bool,这要慢得多。
  • 使用python函数处理数组非常慢,因为数组中的每个项都需要转换为python对象。 np.all不需要做这种转换。

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

+0

Python'all'在'a'上迭代。 all(a)','all(iter(a))','all(list(a))','all(a.tolist())'大致相同。但'全部'可能会短路。设置'a [2] = False'并且看到截然不同的时间。 – hpaulj

+0

'np.all'也短路,不是吗? 'all(a.tolist())'比我的电脑上的all(a)'快得多(2-3倍)。这主要是因为'tolist'方法被优化用于将数组作为python对象列表进行封装。 – MSeifert

1

我会采取摇摆在这个

  • np.all是一个通用的功能,这将有不同的数据类型工作,下这可能会寻找ndarray.all这就是为什么它稍慢。

  • all是一个python内置函数,参见https://docs.python.org/2/library/functions.html#all

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

+0

是否有任何明显的解释,导致放缓实施中发生了什么? – dkv

0

我怀疑numpy的职能做更多的评价一个数组元素为一个布尔,可能在一些普通的数字,第一种方式,而内置all()什么也不做,因为内容已经布尔。

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

+0

不是元素不是'bool'已经。他们是'numpy.bool_'s。虽然它们表现相似(或相同),但它们并不完全相同。“np.bool_不是布尔型” – MSeifert