python怎么实现并行计算_python concurrent.futures 实现并行计算

python因为其全局解释器锁GIL而无法通过线程实现真正的并行计算。这个论断我们不展开,但是有个概念我们要说明,IO密集型 vs. 计算密集型。

IO密集型:读取文件,读取网络套接字频繁。

计算密集型:大量消耗CPU的数学与逻辑运算,也就是我们这里说的并行计算。

而concurrent.futures模块,可以利用multiprocessing实现真正的并行计算。

核心原理是:concurrent.futures会以子进程的形式,平行的运行多个python解释器,从而令python程序可以利用多核CPU来提升执行速度。

由于子进程与主解释器相分离,所以他们的全局解释器锁也是相互独立的。每个子进程都能够完整的使用一个CPU内核。

1. 不采用并行

importglobimportosimportcv2for img_name in glob.glob('*.jpg'):

img=cv2.imread(img_name)

img= cv2.resize(img, (600, 600))

2. 多进程

importglobimportosimportcv2importconcurrent.futuresdefload_and_resize(img_name):

img=cv2.imread(img_name)

img= cv2.resize(img, (600, 600))#Creat a pool of processes. By default, one is created for each CPU in your machine.

with concurrent.futures.ProcessPoolExecutor() as executor:

img_name= glob.glob('*.jpg')

executor.map(load_and_resize, img_name)

是否总能大幅加速?

当你有要处理的数据列表并且要对每个数据点执行类似的计算时,使用Python并行池是一个很好的解决方案。

但是,它并不总是完美的。并行池处理的数据不会以任何可预测的顺序处理。如果你需要处理的结果按特定顺序排列,那么这种方法可能不适合。

你处理的数据还必须是Python知道如何“pickle”的类型。幸运的是,这些类型很常见。以下来自Python官方文档:

None, True, 及 False

整数,浮点数,复数

字符串,字节,字节数组

仅包含可选对象的元组,列表,集合和词典

在模块的顶层定义的函数(使用def,而不是lambda)

在模块顶层定义的内置函数

在模块顶层定义的类

这些类的实例,__dict__或调用__getstate __()的结果是可选择的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值