Python 多处理似乎不使用多个核心
Python multiprocessing doesn't seem to use more than one core
我想使用 Python 多处理来 运行 网格搜索预测模型。
当我查看核心使用情况时,它似乎总是只使用一个核心。知道我做错了什么吗?
import multiprocessing
from sklearn import svm
import itertools
#first read some data
#X will be my feature Numpy 2D array
#y will be my 1D Numpy array of labels
#define the grid
C = [0.1, 1]
gamma = [0.0]
params = [C, gamma]
grid = list(itertools.product(*params))
GRID_hx = []
def worker(par, grid_list):
#define a sklearn model
clf = svm.SVC(C=g[0], gamma=g[1],probability=True,random_state=SEED)
#run a cross validation function: returns error
ll = my_cross_validation_function(X, y, model=clf, n=1, test_size=0.2)
print(par, ll)
grid_list.append((par, ll))
if __name__ == '__main__':
manager = multiprocessing.Manager()
GRID_hx = manager.list()
jobs = []
for g in grid:
p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(p)
p.start()
p.join()
print("\n-------------------")
print("SORTED LIST")
print("-------------------")
L = sorted(GRID_hx, key=itemgetter(1))
for l in L[:5]:
print l
我会说:
for g in grid:
g.p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(g.p)
g.p.start()
for g in grid:
g.p.join()
当前您正在创建一个作业,然后等待它完成,然后转到下一个。
您的问题是您在开始后立即加入每项工作:
for g in grid:
p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(p)
p.start()
p.join()
join 阻塞,直到相应进程完成工作。这意味着您的代码一次 仅启动一个进程,等到它完成后再启动下一个进程 。
为了让所有进程运行并行,您需要首先启动它们然后加入它们:
jobs = []
for g in grid:
p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(p)
p.start()
for j in jobs:
j.join()
文档:link
根据 the documentation,join() 命令锁定当前线程,直到指定线程 returns。因此,您基本上是在 for 循环中启动每个线程,然后等待它完成,然后再继续下一次迭代。
我建议将连接移到循环外!
我想使用 Python 多处理来 运行 网格搜索预测模型。 当我查看核心使用情况时,它似乎总是只使用一个核心。知道我做错了什么吗?
import multiprocessing
from sklearn import svm
import itertools
#first read some data
#X will be my feature Numpy 2D array
#y will be my 1D Numpy array of labels
#define the grid
C = [0.1, 1]
gamma = [0.0]
params = [C, gamma]
grid = list(itertools.product(*params))
GRID_hx = []
def worker(par, grid_list):
#define a sklearn model
clf = svm.SVC(C=g[0], gamma=g[1],probability=True,random_state=SEED)
#run a cross validation function: returns error
ll = my_cross_validation_function(X, y, model=clf, n=1, test_size=0.2)
print(par, ll)
grid_list.append((par, ll))
if __name__ == '__main__':
manager = multiprocessing.Manager()
GRID_hx = manager.list()
jobs = []
for g in grid:
p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(p)
p.start()
p.join()
print("\n-------------------")
print("SORTED LIST")
print("-------------------")
L = sorted(GRID_hx, key=itemgetter(1))
for l in L[:5]:
print l
我会说:
for g in grid:
g.p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(g.p)
g.p.start()
for g in grid:
g.p.join()
当前您正在创建一个作业,然后等待它完成,然后转到下一个。
您的问题是您在开始后立即加入每项工作:
for g in grid:
p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(p)
p.start()
p.join()
join 阻塞,直到相应进程完成工作。这意味着您的代码一次 仅启动一个进程,等到它完成后再启动下一个进程 。
为了让所有进程运行并行,您需要首先启动它们然后加入它们:
jobs = []
for g in grid:
p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(p)
p.start()
for j in jobs:
j.join()
文档:link
根据 the documentation,join() 命令锁定当前线程,直到指定线程 returns。因此,您基本上是在 for 循环中启动每个线程,然后等待它完成,然后再继续下一次迭代。
我建议将连接移到循环外!