【问题标题】:`numpy.sum` vs. `ndarray.sum``numpy.sum` 与 `ndarray.sum`
【发布时间】:2018-02-23 06:35:59
【问题描述】:

对于一个一维的numpy数组a,我以为np.sum(a)a.sum()是等价的函数,但我只是做了一个简单的实验,似乎后者总是快一点:

In [1]: import numpy as np

In [2]: a = np.arange(10000)

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

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

为什么会有差异? 这是否意味着我们应该始终使用summeanstd 等函数的numpy.ndarray 版本?

【问题讨论】:

  • 大多数情况下,您会看到一级函数重定向的差异。在大多数情况下,函数版本会将任务重定向到方法(查看代码)。不要担心这里的速度 - 使用使您的代码(对您和您的读者)最清晰的形式。如果您的输入可能是列表而不是数组,则必须使用函数版本。

标签: python performance numpy


【解决方案1】:

我想这是因为np.sum() 之类的需要先将输入显式转换为ndarray(使用np.asanyarraychecks a few other .sum functions,然后再确定ndarray.sum方法,以便允许对列表、元组等进行操作。

另一方面,ndarray.sum()ndarray 类的方法,因此不需要进行任何检查。

【讨论】:

  • 谢谢,但我认为转换应该归结为简单检查 a 是否已经是一个数组,并且不应该涉及显式复制,对吧?
  • 你会这么认为,但实际上似乎推断出a 是一个ndarray only if nothing else's .sum method works,包括生成器和旧的numeric multiarray
  • 这是有道理的,如果你不需要的话,你不想将一个大的链表转换为ndarray
  • @Hilbert:没有复制 - 开销是 O(1),而不是 O(N)。
  • @Eric 我的猜测是保持标准sum 的功能,以防您使用from numpy import *from pylab import *
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 2016-11-11
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多