三个"所有"之间的区别是什么? 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
答案 0 :(得分:6)
np.all(a)
和a.all()
之间的区别很简单:
a
为numpy.array
,则np.all()
只会致电a.all()
。a
不是numpy.array
,则np.all()
来电会将其转换为numpy.array
,然后致电a.all()
。另一方面,a.all()
会失败,因为a
不是numpy.array
,因此可能没有all
方法。 np.all
和all
之间的差异更为复杂。
all
函数适用于任何可迭代(包括list
,set
,generators
,...)。 np.all
仅适用于numpy.array
s(包括可转换为numpy数组的所有内容,即list
和tuple
s。 np.all
处理具有指定数据类型的array
,这使得它在比较!= 0
时非常有效。然而,all
需要为每个项目评估bool
,这要慢得多。np.all
不需要进行转换。请注意,时间也取决于a
的类型。如果你处理一个python列表all
对于相对较短的列表可以更快。如果你处理一个数组,np.all
和a.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()
什么都不做,因为元素已经是布尔值。
我想知道浮点数的整数结果会有多么不同。