我想幫助理解我做了什麼/爲什麼我的代碼沒有運行,因爲我期望。Python - 循環並行與joblib
我已經開始使用joblib通過並行運行(大)循環來嘗試加速我的代碼。
我使用它,像這樣:
from joblib import Parallel, delayed
def frame(indeces, image_pad, m):
XY_Patches = np.float32(image_pad[indeces[0]:indeces[0]+m, indeces[1]:indeces[1]+m, indeces[2]])
XZ_Patches = np.float32(image_pad[indeces[0]:indeces[0]+m, indeces[1], indeces[2]:indeces[2]+m])
YZ_Patches = np.float32(image_pad[indeces[0], indeces[1]:indeces[1]+m, indeces[2]:indeces[2]+m])
return XY_Patches, XZ_Patches, YZ_Patches
def Patch_triplanar_para(image_path, patch_size):
Image, Label, indeces = Sampling(image_path)
n = (patch_size -1)/2
m = patch_size
image_pad = np.pad(Image, pad_width=n, mode='constant', constant_values = 0)
A = Parallel(n_jobs= 1)(delayed(frame)(i, image_pad, m) for i in indeces)
A = np.array(A)
Label = np.float32(Label.reshape(len(Label), 1))
R, T, Y = np.hsplit(A, 3)
return R, T, Y, Label
我一直在嘗試「n_jobs」,期待,增加這將加快我的功能。但是,隨着我增加n_jobs,事情變得非常緩慢。在沒有「並行」的情況下運行此代碼時,情況會比較慢,直到我將作業數量從1增加爲0.
爲什麼會出現這種情況?我明白我工作越多,腳本越快?我使用這個錯誤?
謝謝!
首先,您在計算機上運行了多少個CPU或核心? 其次,'n_jobs'設置了同時運行的作業的最大數量。你嘗試過'n_jobs = -1'嗎?這應該使用您的計算機中的所有CPU。第三,這個for循環的「indeces」有多大? – fedepad
我有24個內核和大量的內存。 indeces約有10,000個條目,所以認爲這將是一件好事情並行。我可以嘗試n_jobs = -1並回報。 – JB1
是的。我可以想象,如果你將n_jobs從1增加到max(n_jobs = 23,njobs = -1),那麼你會達到一個點,在這個點上增加這個數字將涉及更多的開銷,所以你必須找到一個最佳點。當然,如果你可以使用後端=「線程」可能會更好,但你必須嘗試。 – fedepad