【问题标题】:NumPy ndarray.all() vs np.all(ndarray) vs all(ndarray)NumPy ndarray.all() vs np.all(ndarray) vs all(ndarray)
【发布时间】:2017-09-08 23:36:57
【问题描述】:

Python/NumPy 中的三个“all”方法有什么区别?性能差异的原因是什么? 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

【问题讨论】:

    标签: python performance numpy


    【解决方案1】:

    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 函数适用于任何可迭代对象(包括listsets、generators,...)。 np.all 仅适用于 numpy.arrays(包括可以转换为 numpy 数组的所有内容,即 lists 和 tuples)。
    • np.all 处理具有指定数据类型的array,这在比较!= 0 时非常有效。 all 但是需要为每个项目评估 bool,这要慢得多。
    • 使用 python 函数处理数组非常慢,因为数组中的每个项目都需要转换为 python 对象。 np.all 不需要进行这种转换。

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

    【讨论】:

    • Python alla 上迭代。 all(a)all(iter(a))all(list(a))all(a.tolist()) 一直都差不多。但是all 可以短路。设置a[2]=False 并看到非常不同的时间。
    • np.all 也会短路,不是吗?在我的电脑上,all(a.tolist()) 也比all(a) 快得多(2-3 倍)。这主要是因为 tolist 方法针对将数组包装为 python 对象列表进行了优化。
    【解决方案2】:

    我会试试这个

    • np.all 是一个通用函数,它适用于不同的数据类型,在底层它可能会寻找ndarray.all,这就是它稍微慢一些的原因。

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

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

    【讨论】:

    • 对于导致减速的实施中发生的事情是否有任何明显的解释?
    【解决方案3】:

    我怀疑 numpy 的函数在将数组元素评估为布尔值方面做得更多,可能以某种通用的数字优先方式,而内置 all() 什么都不做,因为元素已经是布尔值。

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

    【讨论】:

    • 不,元素不是bools。他们是numpy.bool_s。虽然它们的行为相似(或相同)但它们并不相同np.bool_ is not bool
    猜你喜欢
    • 2018-10-10
    • 2011-05-02
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2018-06-05
    • 2011-07-18
    • 2021-02-16
    相关资源
    最近更新 更多