Python 自动化办公实战课
尹会生
前游戏公司技术总监,前新浪网研发中心技术经理
21781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 37 讲
Python 自动化办公实战课
15
15
1.0x
00:00/00:00
登录|注册

11 |通过程序并行计算,避免CPU资源浪费

对比并行和串行访问时间
实现并行访问
使用requests包
并行访问网页
总结
如何提高并行计算的效率
怎样实现并行计算
为什么要进行并行计算
思考题
并行计算

该思维导图由 AI 生成,仅供参考

你好,我是尹会生。
在我为运营工作提供技术咨询的时候,遇到过这样一个场景:这场运营活动,需要在电脑和手机端的多个不同应用程序,同时推送产品宣传图片和视频。这些大量的图片需要有不同的格式和尺寸,视频也需要根据不同的 App 截取不同的时长。
如果这类需要大量计算的多个任务成为你的日常工作,会花费你不少的时间和精力。不过别担心,我们可以通过程序并行计算,来提升任务效率。
不过你可能会说,用 Python 自动化执行,也可以提高计算效率啊,那为什么还要学习并行计算呢?
要知道,Python 默认的自动化只能利用 CPU 的一个逻辑核心,如果采用并行计算,那就能够最大化地利用 CPU 资源,从而成倍提升大量计算的任务效率。接下来我就详细分析一下并行计算的高效之处。

为什么要进行并行计算

还是我在开头提出的运营工作的场景。如果你从这类任务消耗计算机主要资源的角度去考虑,会发现这类需求有两个共同的特点。
第一,它们都需要进行大量的计算,而计算主要是通过 CPU 来实现的。CPU 的硬件指标上有两个和计算效率最相关的概念,分别是主频和多核。
主频决定 CPU 处理任务的快慢,多核决定处理的时候是否可以并行运行。这和生活中超市的收银一样,收银员的工作效率和超市开放了多少个收银台的通道,都决定了你能否以最快的速度购买到你想要买的商品。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何通过程序并行计算来避免CPU资源浪费。首先,文章指出了进行并行计算的必要性,特别是在面对大量计算任务时需要充分利用CPU资源,并且需要根据不同需求调整程序参数。接着详细介绍了如何使用Python的multiprocessing多进程库实现并行计算,并提高并行计算的效率。作者强调了自动指定适合计算机的并行度和统计程序运行时间的重要性,并给出了自动设置适合计算机的并行度的代码示例。文章还介绍了如何利用time库来统计程序运行的时间,并对比了并行程序和串行程序的执行时间性能。最后,总结了实现并行计算的基本方法和三个注意事项,以及提出了一个思考题,引发读者思考如何实现多个网站的并行访问。整体而言,本文深入浅出地介绍了并行计算的原理和实现方法,对于需要提高计算效率的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 自动化办公实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 聂小倩
    老师,请问为什么说“在多进程的程序中,不能采用标准数据类型来传递数据”呢?

    作者回复: 这里要涉及操作系统的一些知识,一个Python进程运行之后,会申请自己运行所需要的内存,内存又按照功能分成很多部分,其中的“栈”会存放基本数据类型。那么一个进程中进行变量赋值是需要“栈”这个功能来完成的。 那当你使用了多进程之后,就会产生另一个进程,也就是会申请另一组“栈”。那么两个进程用了两个不同的“栈”,所以无法使用赋值的方式传递变量,而两个进程又可能会有互相通信的需要,所以在设计进程的时候,会再设计进程之间的通信方式,其中管道就是最常用的通信方式之一了。

    2021-04-10
    6
  • 十一哈哈
    windows下使用multiprocessing,要将进程池相关代码应该放在if __name__ == '__main__'下面,要不然运行会报错....

    作者回复: 是的,感谢,忘记在文字下方提醒大家。

    2021-03-08
    2
    6
  • Geek_a345af
    把您的代码复制到我电脑上试了下, 1、发现100以内的求平方,我这边的结果并没有启用多进程,一个进程就做完了这些。改成求1000的内的平方,才创建了两个进程。(电脑cpu是8) 2、queue.put(os.getpid())向队列里添加进程的id,在后面向set里存这些id的时候,发现queue是空的,不太明白是为什么。

    作者回复: 你好,第一个问题,和你怀疑的cpu压力大小和进程数量多少是有一定关系的,基于硬件配置高,没有创建多进程是有可能出现的 2 queue.put(os.getpid()) 之后如果没有报错或没有取出数据之前队列中的数据是不会消失的,建议你这样做: 执行了queue.put(os.getpid()) 之后,增加一个观察队列的代码 ,queue.qsize() 这行代码可以返回队列的大小(队列里元素的数量) 另外在执行过程中,观察一下运行的终端是否有错误产生。

    2022-01-19
    1
  • 天国之影
    老师,我运行出来的时间统计结果如下: 并行计算时间统计: 0.1607363224029541 串行计算时间统计: 0.0009999275207519531 为什么并行计算比串行计算耗时还长?

    作者回复: 从执行结果来看,串行和并行不是一个数量级的速度。所以我猜测你的串行计算程序一定是执行了多次。为什么多次执行相同的程序会变“快”?相信你看到这里心里就有了对正确答案的猜测。没错,这里的串行程序并没有计算,而是由于Python解释器在内存中缓存了短时间多次执行程序的结果。 那么由此,你可能会衍生出另外一个问题:既然能缓存了,跑在生成环境中的代码也可以,那么是不是并行计算无法比串行计算更有优势? 这里一定要清楚,我们跑的测试代码,是两次执行过程的中间结果和最终结果都没有变化,且代码简单才能进行的缓存。一旦进行复杂的常见,中间过程和结果不同,计算过程也就无法缓存了,必然并行和串行都要当做第一次运行来对待。这也经常是我们听到很多编译型语言在吐槽python运行的慢的原因了。 关于python执行代码缓存相关问题,可以参考下面这个链接,得到更详细的解释: https://www.jianshu.com/p/eb100c7bb4cf

    2021-12-08
  • Bill
    打卡

    编辑回复: 棒!

    2021-10-20
  • Soul of the Dragon
    老师,请问如果在代码运行过程中出现“UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-19: ordinal not in range(128)” 这样的报错,应该如何解决呢?

    作者回复: 你的Python应该是python2.x版本,需要将它换成Python3版本,要从官方网站重新下载。

    2021-03-06
  • 天国之影
    如果在Jupyter Notebook下,可使用以下方法: 通过临时文件方式,读取并使用并行计算 from multiprocessing import Pool from functools import partial import inspect def parallal_task(func, iterable, cpu_count = 4): with open(f'./tmp_func.py', 'w') as file: file.write(inspect.getsource(func).replace(func.__name__, "task")) from tmp_func import task if __name__ == '__main__': func = partial(task) pool = Pool(cpu_count * 2) res = pool.map(func, iterable) pool.close() return res else: raise "Not in Jupyter Notebook" # 计算平方 def def_f(x): return x * x for res in parallal_task(def_f, range(1, 101)): print(f'计算平方的结果是:{res}')
    2021-12-08
    1
  • ifelse
    学习打卡
    2023-07-09归属地:浙江
  • 坚果
    这一章有没有windows并行计算参考资料,我一个程序都没有调试成功,一运行就堵塞
    2022-03-27
  • 坚果
    通过临时文件方式,读取并使用并行计算,为什么要通过临时文件使用并行计算?
    2022-03-27
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部