python--利用concurrent.futures 来实现真正的平行计算

    由于python的全局解释锁(GIL)使得我们无法使用线程进行真正的平行计算,因此,我们把总计算量分配到多个独立的任务中,并在多个CPU核心上同时运行任务是很难实现的。

    为解决该类问题,提高代码执行速率,我们尝试可以引入concurrent.futures模块,来利用另外一个名叫multiprocessing的内置模块实现这种需求。该做法会以子程序的形式,平行地运行多个解释器,从而令python程序能够利用多核心CPU来提升执行速度。由于子进程与主解释器相分离,所以,他们的全局解释器锁也是相互独立的。每个子进程都可以完整的利用一个CPU内核,而且这些子进程都与主进程之间有着联系,通过这条联系渠道,子进程可以接收主进程发过来的指令,并把计算结果返回给主进程。

    例如,我们首先定义一个函数:

def demo(info):
    a, b = info
    low = min(a, b)
    for i in range(low,0,-1):
        if a % i == 0 and b % i == 0:
            return i 

接着,我们分别计算没有做平行计算和做了平行计算所需要的时间:

首先,我们先导入一个库:

from concurrent.futures import ProcessPoolExecutor

接着:

然后运行程序之后,我们会发现,直接运行所耗时间大概为14秒,然后双核计算为7秒

另外,关于multiprocessing开销较大的原因:主进程和子进程之间,必须进行序列化和反序列化操作,而程序中的大量开销,正是由这些操作所引发的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值