我正在尝试使用joblib
在机器学习算法的实现中使用一些并行计算,尤其是在this page上使用的技术。
以下示例供我理解并行性,我的ML算法中的第二个示例遇到了同样的问题。
此示例按预期在所有4个内核上运行:
from joblib import Parallel, delayed
N_PARAM = 10000
N_TEST_FUN = 10000000
def testfunc(data):
for _ in range(N_TEST_FUN):
for i in data:
i*i
def run(niter=10):
data = [list(range(N_PARAM)) for _ in range(niter)]
pool = Parallel(n_jobs=-1, verbose=1, pre_dispatch='all')
results = pool(delayed(testfunc)(dd) for dd in data)
if __name__ == '__main__':
run()
此示例仅在1上运行
from joblib import Parallel, delayed
N_PARAM = 10000
N_TEST_FUN = 10000000
def testfunc():
for _ in range(N_TEST_FUN):
for i in range(N_PARAM):
i**2
def run(niter=10):
pool = Parallel(n_jobs=-1, verbose=1, pre_dispatch="all")
pool(testfunc() for _ in range(niter))
if __name__ == "__main__":
run()
我一点都不明白。为什么会这样?
我是Ubuntu 18.10,我使用的是Anaconda发行版的joblib 0.13.2和python 3.6.8。
答案 0 :(得分:0)
您可以在此处找到答案:
what-does-the-delayed-function-do-when-used-with-joblib-in-python
接受的答案有充分的解释。
据我了解,您的第二个示例pool(testfunc() for _ in range(niter))
在函数可以传递给多进程之前返回结果。