假設幾次被稱爲多次的函數。這些函數在3d矢量(1x3數組)上執行諸如乘法,除法,加法等操作。使用python和numpy進行簡單到中等計算的有效方法
考慮:
import numpy as np
import math
x = [0,1,2]
y = [3,2,1]
a = 1.2
根據我的測試,它是更快的Python數學庫做:
math.sin(a)
比numpy的做:
np.sin(a)
此外,使用中討論的方法,python比np.linalg.norm更簡單的算法(如標準化)更快。
現在,如果我們爲數據添加一些複雜性,比如對3d執行矩陣乘法,那麼我們有一個3x3的旋轉矩陣,然後乘以另一個矩陣並進行轉置,numpy開始獲得優勢。
目前,比如做業務:
L = math.sqrt(V[0] * V[0] + V[1] * V[1] + V[2] * V[2])
V = (V[0]/L, V[1]/L, V[2]/L)
快得多一再呼籲的時候(我從沒有開銷承擔創建numpy的陣列)。
但是,爲了使用numpy矩陣函數,數組需要是numpy。使用np.asarray()具有很大的開銷,這使得根本不使用numpy之間的效率邊界,接受創建數組的開銷,或接受標量上的numpy數學函數的效率並僅使用numpy。
當然,我可以嘗試所有這些方法,但在大型算法中,可能的組合太多了。在這種情況下是否有任何策略能夠在python和numpy之間高效切換?
編輯: 從一些評論看來,這個問題似乎還不夠清楚。我知道numpy對大套裝更有效率,這就是爲什麼這個問題存在。該算法不只是計算正弦。下面的代碼可能更容易理解:
x = [2,1,2]
math.sin(x[0])
L = math.sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2])
V = (x[0]/L, x[1]/L, x[2]/L)
math.sin(V[0])
#Do something else here
您是如何比較執行速度的?如果你使用矢量化(因爲你總是應該用numpy,也就是說,而不是運行'np.sin(a)'幾千次,運行'np.sin(np.repeat(1.2,1000))'一次),我懷疑它是比Python自己的「數學」慢。 – Phillip 2015-03-02 08:55:33
@Phillip我用timeit, – user1938107 2015-03-02 09:01:38
timeit.timeit('import numpy as np; import math; math.sin(234.2343),100000')並在math.sin和np.sin之間切換 – user1938107 2015-03-02 09:02:21