Python 在多次调用后,多处理池会逐渐变慢
我想在一个数据集上迭代训练1000个随机林。为了加快速度,我尝试在迭代训练循环中使用多个核心。下面是一个工作示例: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
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中运行得越来越慢”