赞
踩
现在cpu动不动就是6核12进程,计算能力越来越强,但是我们真的都用上了么?在跑python代码时,请打开你的后台监控,看看python的CPU占比。如果不做特殊处理(排除你调用的库),很有可能你的代码最高只能占用100%,资源利用率低下。
还有另外一个故事,当你的计算复杂度很高的时候,比如处理某些大文件,如果你只用一个进程,很有可能得跑24小时,为了加速,你就得想办法把你的计算资源用起来,想办法并行运算。那么python什么库是来帮助我们进行并行计算的呢?
有请我们的multiprocess同学来发表获奖感言,“感谢cctv,感谢铁岭tv…”
multiprocess提供了两个类来实现多进程计算
__init__(self, group=None, target=None, name=None, args=(), kwargs={})
其中group分组,通常不用;target是要执行的函数;name名称;args表示给函数传递的参数def do(i):
print(f"我是进程小{i} 我为自己带盐!")
for i in range(3):
p = Processor(target=do, args=(i, ), name=f"work_{i}")
p.start()
import multiprocessing
from multiprocessing import Process
from multiprocessing import Queue
def func(i, q):
ret = q.get()
print("进程%s从队列里获取了一个%s,然后又向队列里放入了一个%s" % (i, ret, i))
q.put(i)
if __name__ == "__main__":
lis = Queue(20)
lis.put(0) # 往lis中压入
for i in range(10):
p = Process(target=func, args=(i, lis,))
p.sta
使用Queue的优势,制定一个有限长队列,消费完成后可以销毁,这样内存消耗就有限,遇到几百G大的训练数据,可以不用一次性加载,但是因为要并行,可以通过多进程把部分读如队列里面,然后你进行多进程消费。
进程池方法是个人最早接触的方法,感觉特别简单,你只要开启进程池,然后借助map方法,分分钟实现多进程。
from multiprocessing import Pool
def do(name):
print(f"hello {name}")
name_list = ["liming", "hanmeimei", "xiaogang"]
pool = Pool(3) # 制定要开启的进程数, 限定了进程上限
pool.map(do, name_list)
pool.close()
pool.join()
是不是很简单,除了map方法,Pool还有apply、apply_async 、map_async方法,不一一解说,大家可以参考[2、3]。
当你的代码慢到阻碍你幸福生活的时候,请想办法加速!如果你用的是python,请记起你的老朋友——multiprocess!
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。