5
考慮下面兩個函數,它們將小序列中的每個數與大序列中的每個數乘以構成一個二維數組,然後將所有數值加倍陣列。 noloop()
使用2D numpy數組的直接乘法並返回結果,而loop()
使用for循環遍歷arr1
並逐漸建立輸出數組。爲什麼for循環比二維數組乘法更快numpy
import numpy as np
arr1 = np.random.rand(100, 1)
arr2 = np.random.rand(1, 100000)
def noloop():
return (arr1*arr2)*2
def loop():
out = np.empty((arr1.size, arr2.size))
for i in range(arr1.size):
tmp = (arr1[i]*arr2)*2
out[i] = tmp.reshape(tmp.size)
return out
我預計noloop
是,即使是少量的迭代更快,但對於陣列上方大小,loop
實際上更快:
>>> %timeit noloop()
10 loops, best of 3: 64.7 ms per loop
>>> %timeit loop()
10 loops, best of 3: 41.6 ms per loop
有趣的是,如果我在這兩個刪除*2
功能,noloop
比較快,但幅度不大:
>>> %timeit noloop()
10 loops, best of 3: 29.4 ms per loop
>>> %timeit loop()
10 loops, best of 3: 34.4 ms per loop
是否有個很好的解釋這些結果,是否有一種更快的方式來執行相同的任務?
我得到'noloop()'不是'循環速度更快(由〜15%)()'不管...... – 2015-01-21 11:10:48
我也得到了逆轉python2和python3。 – 2015-01-21 11:26:19
根據OP的建議,我得到'loop'的速度更快(在我的機器中減少了28%)。 Python 3.4.1 | Anaconda 2.1.0,IPython 2.2.0 – Roberto 2015-01-21 11:37:30