2016-07-08 68 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