Python 在多次调用后,多处理池会逐渐变慢

Python 在多次调用后,多处理池会逐渐变慢,python,scikit-learn,multiprocessing,random-forest,Python,Scikit Learn,Multiprocessing,Random Forest,我想在一个数据集上迭代训练1000个随机林。为了加快速度,我尝试在迭代训练循环中使用多个核心。下面是一个工作示例: from sklearn.ensemble import RandomForestClassifier from multiprocessing import Pool,cpu_count import numpy as np import pandas as pd from time import time n = 2000 ndims = 5000 X = pd.DataF

我想在一个数据集上迭代训练1000个随机林。为了加快速度,我尝试在迭代训练循环中使用多个核心。下面是一个工作示例:

from sklearn.ensemble import RandomForestClassifier
from multiprocessing import Pool,cpu_count
import numpy as np
import pandas as pd
from time import time

n = 2000
ndims = 5000

X = pd.DataFrame(np.random.normal(0,1,n*ndims).reshape((n,ndims)))
y = pd.Series(np.random.choice([0, 1], size=(n)))


def draw_batches(n,size=100):
    steps = np.arange(0,n,size)
    if not n%size == 0:
        steps = np.append(steps,n%size)[1:]
    for step in steps:
        if not step%size == 0:
            yield step
        else:
            yield size


def pool(method,iters):
    output = []
    p = Pool(4)
    try:
        output = p.map(method,iters)
    except Exception as e:
        print(e)
        pass
    finally:
        p.close()
        p.join()
        del p
    return output


def importances(args):
    model, i = args
    y_ = y.copy()
    model.fit(X,y_)
    return model.feature_importances_

n_iters = 100
model_cls = RandomForestClassifier

for batch in draw_batches(n_iters,4):
    print(batch)
    t = time()
    train_args = [(model_cls(n_estimators=50),i) for i in np.arange(batch)]
    imps = pool(importances,train_args)
    print((time()-t)/batch)
尽管不像我正在编写的代码中那样明显,但上面显示的是,运行的批数越多,每个模型的处理时间就会逐渐增加。我不希望出现这种情况,因为池处理都包含在内,并且在每次运行结束时都会删除所有内容


是什么导致了减速

RandomForestClassifier
可以使用多个cpu核-
n_作业
参数。尝试这种方法并比较运行时间。@Poolka,谢谢,但问题不是“我如何让sklearn.RandomForest运行得更快”,而是“为什么同一个林在多处理时运行得越来越慢。Pool”
RandomForestClassifier
可以使用多个cpu核-
n_作业
参数。尝试这种方法并比较运行时间。@Poolka,谢谢,但问题不是“如何使sklearn.RandomForest运行得更快”,而是“为什么同一个林在多处理.Pool中运行得越来越慢”