2016-07-08 34 views
0

这让我感到惊讶。我一直在测试演出。为什么numpy.sum buiding新生成器比使用范围更快?

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 *

+4

'sum([range(100000)])'是'TypeError',所以我不确定你在这里进行有用的比较...... – jonrsharpe

+0

@jonrsharpe。啊哈!你的回答让我想到,我从'numpy import *'有这个事实与它有关...... – Aguy

+2

这就是为什么你从不使用'from事物导入*'...还要说明哪个版本的Python将会有所帮助,因为范围在2.x和3.x之间是不同的。 – jonrsharpe

回答

2

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

与numpy的的 sum()实施
%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 

现在:

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问题。

+0

问题依然存在,为什么最后一个最快?也使我感到惊讶。 – RemcoGerlich

相关问题