11 |通过程序并行计算,避免CPU资源浪费
该思维导图由 AI 生成,仅供参考
为什么要进行并行计算
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何通过程序并行计算来避免CPU资源浪费。首先,文章指出了进行并行计算的必要性,特别是在面对大量计算任务时需要充分利用CPU资源,并且需要根据不同需求调整程序参数。接着详细介绍了如何使用Python的multiprocessing多进程库实现并行计算,并提高并行计算的效率。作者强调了自动指定适合计算机的并行度和统计程序运行时间的重要性,并给出了自动设置适合计算机的并行度的代码示例。文章还介绍了如何利用time库来统计程序运行的时间,并对比了并行程序和串行程序的执行时间性能。最后,总结了实现并行计算的基本方法和三个注意事项,以及提出了一个思考题,引发读者思考如何实现多个网站的并行访问。整体而言,本文深入浅出地介绍了并行计算的原理和实现方法,对于需要提高计算效率的读者具有一定的参考价值。
《Python 自动化办公实战课》,新⼈⾸单¥59
全部留言(12)
- 最新
- 精选
- 聂小倩老师,请问为什么说“在多进程的程序中,不能采用标准数据类型来传递数据”呢?
作者回复: 这里要涉及操作系统的一些知识,一个Python进程运行之后,会申请自己运行所需要的内存,内存又按照功能分成很多部分,其中的“栈”会存放基本数据类型。那么一个进程中进行变量赋值是需要“栈”这个功能来完成的。 那当你使用了多进程之后,就会产生另一个进程,也就是会申请另一组“栈”。那么两个进程用了两个不同的“栈”,所以无法使用赋值的方式传递变量,而两个进程又可能会有互相通信的需要,所以在设计进程的时候,会再设计进程之间的通信方式,其中管道就是最常用的通信方式之一了。
2021-04-106 - 十一哈哈windows下使用multiprocessing,要将进程池相关代码应该放在if __name__ == '__main__'下面,要不然运行会报错....
作者回复: 是的,感谢,忘记在文字下方提醒大家。
2021-03-0826 - 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-191 - 天国之影老师,我运行出来的时间统计结果如下: 并行计算时间统计: 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-081
- ifelse学习打卡2023-07-09归属地:浙江
- 坚果这一章有没有windows并行计算参考资料,我一个程序都没有调试成功,一运行就堵塞2022-03-27
- 坚果通过临时文件方式,读取并使用并行计算,为什么要通过临时文件使用并行计算?2022-03-27