Python 为什么numpy.sum建造新发电机比仅使用范围更快?

Python 为什么numpy.sum建造新发电机比仅使用范围更快?,python,python-3.x,numpy,Python,Python 3.x,Numpy,这让我有点吃惊。我一直在测试性能 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.

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

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时生成列表


我正在使用numpy import*中的

运行相同的代码,我得到以下结果(Python 3.5.1):

现在使用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
所发生的情况是,通过使用来自numpy import*
(或来自numpy import sum的
),您正在破坏Python的内置
sum()
函数


看看讨论两个实现之间性能比较的问题。

运行相同的代码,我得到以下结果(Python 3.5.1):

现在使用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
所发生的情况是,通过使用来自numpy import*
(或来自numpy import sum的
),您正在破坏Python的内置
sum()
函数


看看讨论两个实现之间性能比较的SO问题。

sum([range(100000)])
是一个
类型错误,所以我不确定您在这里是否进行了有用的比较…@jornsharpe。啊哈!你的回答让我想到,我从numpy import*
中获得了
,这与此有关……这就是为什么你从不使用thing import*
中的
。。。还需要澄清Python的哪个版本会有帮助,因为2.x和3.x之间的
range
不同。@Theguy:numpy定义了自己的
sum
函数。@jornsharpe,这是spyder中的默认值。我在Python3上。
sum([range(100000)]
是一个
类型错误,所以我不确定您在这里是否进行了有用的比较…@jornsharpe。啊哈!你的回答让我想到,我从numpy import*
中获得了
,这与此有关……这就是为什么你从不使用thing import*
中的
。。。还需要澄清Python的哪个版本会有帮助,因为2.x和3.x之间的
range
不同。@Theguy:numpy定义了自己的
sum
函数。@jornsharpe,这是spyder中的默认值。我使用的是python 3。问题是,为什么最后一个是最快的?我也很惊讶。问题是,为什么最后一个最快?我也很惊讶。