python-18-并行计算pp模块

目前个人计算机大都是多核的,但是在运行python程序的时候会发现实际上只有一个核心(CPU)在跑代码,另外几个核心都在空闲,如下图。
在这里插入图片描述

1 安装pp模块

并行计算的目的是将所有的核心都运行起来以提高代码的执行速度,在python中由于存在全局解释器锁(GIL)如果使用默认的python多线程进行并行计算可能会发现代码的执行速度并不会加快。

一些并行模块通过修改pyhton的GIL机制突破了这个限制,使得Python在多核电脑中也能够有效的进行并行计算。PP(Parallel Python)模块就是其中一种。

下载地址https://www.parallelpython.com/downloads.php
在这里插入图片描述

解压缩
进入解压目录
python setup.py install

2 使用

(1)导入pp模块
(2)开启pp服务,没有填参数表示使用全部核心进行计算
(3)设定任务,并且执行job_server.submit函数
(4)通过函数调用的方式获取并行计算结果

# (1)导入模块
import pp
# (2)开启服务
job_server = pp.Server()  # 默认使用全部核心数
# job_server = pp.Server(ncpus=4)  # 可以自己指定核心数
# (3)提交任务
f1 = job_server.submit(func1, args1 , depfuncs1, modules1)
# func1: 被并行执行的函数
# args1: func的参数,以元组的形式传入
# depfuncs1: 被func调用的函数,以元组的形式传入
# modules1: 函数执行需要调用的模块,以元组的形式传入
# (4)获取结果
result1 = f1()

例如

# (1)导入模块
import pp
import math
import time


def isprime(n):
    # 判断一个数是否是质数
    # 质数定义:只能被1或者自身整除的自然数(不包括1),称为质数。
    # 判断一个数是否是质数,只需判断它是否能被小于它开根后的所有数整除
    if not isinstance(n, int):
        raise TypeError("argument passed to is_prime is not of 'int' type")
    if n < 2:
        return False
    if n == 2:
        return True
    maxvalue = int(math.ceil(math.sqrt(n)))
    i = 2
    while i <= maxvalue:
        if n % i == 0:
            return False
        i += 1
    return True

def sum_primes(n):
    # 计算小于整数n的所有质数的和
    return sum([x for x in range(2, n) if isprime(x)])


if __name__ == "__main__":
    job_server = pp.Server()
    print("***并行计算***")
    t1 = time.time()
    f1 = job_server.submit(sum_primes, (100000,), (isprime,), ("math",))
    f2 = job_server.submit(sum_primes, (100100,), (isprime,), ("math",))
    f3 = job_server.submit(sum_primes, (100200,), (isprime,), ("math",))
    f4 = job_server.submit(sum_primes, (100300,), (isprime,), ("math",))
    a = f1()
    b = f2()
    c = f3()
    d = f4()
    t2 = time.time()
    print(str(t2-t1), a, b, c, d)

    print("***一般计算***")
    t3 = time.time()
    a = sum_primes(100000)
    b = sum_primes(100100)
    c = sum_primes(100200)
    d = sum_primes(100300)
    t4 = time.time()
    print(str(t4-t3), a, b, c, d)

    print("***并行另一种写法***")
    t5 = time.time()
    inputs = (100000, 100100, 100200, 100300)
    jobs = [(job_server.submit(sum_primes, (input,), (isprime,), ("math",))) for input in inputs]
    for job in jobs:
        print(job())
    t6 = time.time()
    print(str(t6-t5))
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮冰燃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值