import numpy as np
import multiprocessing
from itertools import repeat
def group_data_by_runID(args):
data, runID = args
return data[data[:,0].astype(int)==runID,:]
%%time
DATA = np.array([[0,1],[0,2],[0,3],[0,4],[1,5],[1,6],[1,7],[1,8],[2,9],[2,10],[2,11],[2,12]])
runIDs = [0,1,2]*10000000
pool = multiprocessing.Pool(40)
list(pool.map(group_data_by_runID, zip(repeat(DATA), runIDs)))
您可以在上面的代码中看到,我打算使用40个内核(56个内核,并且该系统上的可用内存远远超过此内存)来运行代码,这花了1分钟31秒。然后我用:
list(map(group_data_by_runID, zip(repeat(DATA), runIDs)))
[花了2分33秒。因此,再次使用40个内核的性能不到性能的两倍,这对我来说很奇怪。我还注意到,即使是40核,有时它实际上也不会在40核中启动,因为它可以在htop中看到。
我在哪里做错了?以及如何提高速度。请注意,实际数据要大得多。
我发现multiprocessing.Pool()在以下情况下的行为不符合预期。任何人都可以解释它为什么会出现这种情况以及在可能的情况下如何提高性能。以下只是...