【问题标题】:Parallelization with multiprocessing, joblib or multiprocess is not working与多处理、joblib 或多进程的并行化不起作用
【发布时间】:2021-06-14 15:47:21
【问题描述】:

有这篇 stackoverflow 帖子很好地展示了一种计算 RandomForestClassifier() 的邻近矩阵的方法。

Proximity Matrix in sklearn.ensemble.RandomForestClassifier

但是,如果您有一个大数据框,该脚本中的 for 循环会非常慢。我试图并行化这个 for 循环,但没有成功。我只得到“无”作为输出。

如何在 Spyder 4Python 3.8.5 上并行化这个 for 循环>Windows 10

proxMat = 1*np.equal.outer(a, a)

for i in range(1, nTrees):
      a = terminals[:,i]
      proxMat += 1*np.equal.outer(a, a)

【问题讨论】:

    标签: python for-loop parallel-processing multiprocessing spyder


    【解决方案1】:

    在这里你想执行一个 reduce 操作——所以并行化并不明显。 您没有指定如何尝试并行化循环。 一种简单的并行化方法:

    import multiprocessing
    pool = multiprocessing.Pool(processes=4)
    
    def get_outer(i):
       return np.equal.outer(terminals[:,i],terminals[:,i])
    
    todo = list(range(1, nTrees))
    results = pool.map(get_outer, todo)
    proxMat = 1*np.equal.outer(a, a)
    for res in results:
        proxMat+ = res
    

    我不确定这个会有所帮助,但可能你会遇到更少的酸洗问题:

    import multiprocessing
    pool = multiprocessing.Pool(processes=4)
    
    def get_outer(t):
       return np.equal.outer(t,t)
    
    # This part might be costly !
    terms = [terminals[:,i] for i in range(1, nTrees)]
    
    results = pool.map(get_outer, terms)
    proxMat = 1*np.equal.outer(a, a)
    for res in results:
        proxMat+ = res
    

    【讨论】:

    • 嗨 SergeD,感谢您的建议,但是结果会引发错误:'Can't pickle : attribute lookup on__main__ failed'
    • 尝试以另一种方式声明函数(常规函数声明等)。如果你有一个定义明确的函数, multiprocessing.pool.map 应该可以工作。我编辑了代码。
    • 似乎有很多关于如何将几个参数传递给 pool.map 的讨论。也许在这里查看:stackoverflow.com/questions/5442910/…
    猜你喜欢
    • 2019-01-06
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多