【问题标题】:Why for numpy.sum buiding new generator is faster than using just range?为什么 numpy.sum 构建新生成器比仅使用范围更快?
【发布时间】:2016-11-10 17:17:11
【问题描述】:

这让我有点吃惊。我一直在测试性能。

In [1]: import numpy as np

In [2]: %timeit a = np.sum(range(100000))
Out[2]: 100 loops, best of 3: 16.7 ms per loop

In [3]: %timeit a = np.sum([range(100000)])
Out[3]: 100 loops, best of 3: 16.7 ms per loop

In [4]: %timeit a = np.sum([i for i in range(100000)])
Out[4]: 100 loops, best of 3: 12 ms per loop

In [5]: %timeit a = np.sum((i for i in range(100000)))
Out[5]: 100 loops, best of 3: 8.43 ms per loop

我正在尝试了解内部工作,并学习如何概括以获得最佳实践。为什么 4(构建新生成器)比 1 好?

我明白为什么创建列表需要更多时间。但同样,为什么 3 比 2 好?为什么 2 不比 1 差?是否在 1 处建立列表?

我正在使用from numpy import *

【问题讨论】:

  • sum([range(100000)])TypeError,所以我不确定您是否在这里进行了有用的比较...
  • @jonrsharpe。啊哈!你的回答让我想到我拥有from numpy import * 的事实与它有关......
  • 这就是为什么你从不使用from thing import *...另外澄清哪个版本的Python会有所帮助,因为range在2.x和3.x之间是不同的。
  • @Theguy:numpy 定义了自己的sum 函数。
  • @jonrsharpe,这是 spyder 的默认设置。我在 python 3 上。

标签: python python-3.x numpy


【解决方案1】:

运行相同的代码,我得到了这些结果(Python 3.5.1):

%timeit a = sum(range(100000))
100 loops, best of 3: 3.05 ms per loop

%timeit a = sum([range(100000)])
>>> TypeError: unsupported operand type(s) for +: 'int' and 'range'

%timeit a = sum([i for i in range(100000)])
100 loops, best of 3: 8.12 ms per loop

%timeit a = sum((i for i in range(100000)))
100 loops, best of 3: 8.97 ms per loop

现在使用 numpy 的 sum() 实现:

from numpy import sum

%timeit a = sum(range(100000))
10 loops, best of 3: 19.7 ms per loop

%timeit a = sum([range(100000)])
10 loops, best of 3: 20.2 ms per loop

%timeit a = sum([i for i in range(100000)])
100 loops, best of 3: 16.2 ms per loop

%timeit a = sum((i for i in range(100000)))
100 loops, best of 3: 9.27 ms per loop

实际情况是,使用 from numpy import *(或 from numpy import sum)会破坏 Python 的内置 sum() 函数。

查看this SO 问题,该问题讨论了两种实现之间的性能比较。

【讨论】:

  • 问题仍然存在,为什么最后一个最快?也让我大吃一惊。
猜你喜欢
  • 2015-10-24
  • 2016-12-02
  • 2019-05-29
  • 2012-07-21
  • 2020-11-08
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多