有沒有辦法加快從上一次迭代更新其值的雙迴圈?
在**中:
def calc(n, m):
x = 1.0
y = 2.0
container = np.zeros((n, 2))
for i in range(n):
for j in range(m):
x=np.random.gamma(3,1.0/(y*y+4))
y=np.random.normal(1.0/(x+1),1.0/sqrt(x+1))
container[i, 0] = x
container[i, 1] = y
return container
calc(10, 5)
如您所見,內部迴圈更新變數x和y,而外部迴圈每次以不同的x值開始.我不認為這是可向量化的,但也許還有其他可能的改進.
謝謝!解決方法:
我不認為這會增加任何重要的加速,但如果你一次生成所有的伽瑪和正態分佈的隨機值,你可以儲存一些函式呼叫.
gamma函式具有scaling property,因此如果從gamma(k,1)分布中繪製值x,則c * x將是從gamma(k,c)分布中繪製的值.類似地,使用正態分佈,您可以獲取從法線(0,1)分布中繪製的y值,並將其轉換為從執行x * s m的法線(m,s)分布中繪製的值.所以你可以按如下方式重寫你的函式:
def calc(n, m):
x = 1.0
y = 2.0
container = np.zeros((n, 2))
nm = n*m
gamma_vals = np.random.gamma(3, 1, size=(nm,))
norm_vals = np.random.normal(0, 1, size=(nm,))
for i in xrange(n):
for j in xrange(m):
ij = i*j
x = gamma_vals[ij] / (y*y+4)
y = norm_vals[ij]/np.sqrt(x+1) + 1/(x+1)
container[i, 0] = x
container[i, 1] = y
return container
如果你的發行版的實際引數有乙個更簡單的表示式,你實際上可以使用一些精心設計的np.cumprod等形式,並為自己節省迴圈.我無法弄清楚這樣做的方法……
標籤:python,optimization,loops,micro-optimization,numpy
python雙重for迴圈優化方法。
用python做影象處理。有些特殊需求需要用雙重for迴圈遍歷影象來操作例如下面 def getbinarizationimg simg,targeth,targetw print simg.shape h,w,c simg.shape box np.zeros h,w dtype np.uint8...
對集合中雙重迴圈的優化思路
對集合中雙重迴圈的優化思路 一遍雜湊表 事實證明,我們可以一次完成。在進行迭代並將元素插入到表中的同時,我們還會回過頭來檢查表中是否已經存在當前元素所對應的目標元素。如果它存在,那我們已經找到了對應解,並立即將其返回。public int twosum int nums,int target map...
python終端中執行py檔案
在除錯或使用某些模組時,需要時刻改變一些變數的值,若寫成py檔案,則每次都要儲存,而很多測試的內容是沒必要的。故可以先執行一些配置環境的py檔案,然後在python終端即互動模式下,呼叫類及其方法來測。其實只要加入 i的選項即可,如 當前目錄有檔案detail.py,內容為具體的執行語句,不是類的定...