不懂就问: Python 脚本 并行

2019-08-02 04:58:47 +08:00
 Thymolblue

想请教各位 V 友一些问题

我不是计算机相关的专业,大学选修学的 C 和 Fortran,经常需要写一些脚本处理数据

以前都是用 C 或者 Fortan 写脚本(我的 C 水平很菜),直到最近学会了 python

发现 python 写脚本比 C 和 Fortran 轻松多了,但是运行速度不是很快

然后又了解到了并行,google 出了各种教程,还是没看明白

最后在懵 B 状态下用了 multiprocessing 库里面的 Process

虽然程序是可以跑起来,也加速了不少,但是还是不了解运行的过程,问题如下:

1.为什么必须要有 if __name__ == '__main__' :

2.我想统计程序时间,代码和输出如下,输出了时间变乱了,是不是并行之后程序的运行顺序会改变?

	这是输出 http://tva1.sinaimg.cn/large/0060lm7Tly1g5kue0h947j30rl0ph76k.jpg
    
	这是代码(书写风格可能不符合规范,平时也就自己看,请大佬勿喷)		  
	http://tva1.sinaimg.cn/large/0060lm7Tly1g5kuh4tpuzj30yw0jhq5m.jpg
    
3.关于 process 和 pool,我不知道改在什么时候使用其中哪一个。

4.如果想思路清晰,知道自己每一步在干什么地写一个并行脚本应该从哪开始学?(python 官网的 doc 看的不太懂,可能是我没有计算机相关的基础吧)
2901 次点击
所在节点    Python
10 条回复
silkriver
2019-08-02 06:57:58 +08:00
leishi1313
2019-08-02 07:04:54 +08:00
不常用 multiprocessing,挑着回答下:
1. 不必须,但这是你能用 python ***.py 跑你代码的充分不必要条件
2. 并行了之后每个子任务什么时候执行就不是你能决定的了,如果要统计总时间,可以看看.join()
3. 不清楚
4. 并行计算挺难的,如果你需求不大,就多写写多问问就好了,想要系统地学习可以搜搜 Parallel Computing,看看有没有公开课什么的
RHxW
2019-08-02 08:12:15 +08:00
第一个问题是为了区别直接执行和外部引用的吧
Dilras
2019-08-02 08:54:57 +08:00
1. 简单说'__main__'是模块默认的名字,这么写的意思是只在直接运行这个模块的时候执行后面的代码,如果它被 import 到其它模块,后面的不执行。
2. 多进程,多线程都是抢占式调度,由操作系统控制,所以执行的顺序是不可预料的。可以用锁保护非原子操作。
3. 进程和进程池的区别,process 就是单个进程,pool 是一开始直接创建多个进程,用到时就从里面拿,用完放回去。
4. 英文 OK 的话,推荐 https://realpython.com/learning-paths/python-concurrency-parallel-programming/这个系列,中文可以读 Cookbook 中对应的章节,书有开源翻译版
Dilras
2019-08-02 08:55:50 +08:00
oahebky
2019-08-02 10:10:07 +08:00
基于你需要经常写脚本做事情的这个前提。
建议你“系统”地学习一门你选择的语言。
这么问几个问题,就算给你解释了,要嘛忘记,要嘛看得懂字但是不知道含义,要嘛后面还会有更多的问题。

推荐你看 Learning Python (中文:《 Python 学习手册》),和《 Python3 程序开发指南》。

至于问题:
1. 这是脚本语言,所以有“载入时”(“编译”)和运行时的区别,同时对应的代码文件会被设置 __name__ 变量,再具体请看书。
2. 并行可以简单理解成“同时”执行代码。可以参考斯坦福大学《编程范式》大约 15~20 课中间有一两课讲解并行编程。
3. 简单来讲,多个相同的函数并行执行,可以用 pool。不同函数并行执行,用 process
4. 看书。
oahebky
2019-08-02 10:12:06 +08:00
@oahebky #6 原文:“基于你需要经常写脚本做事情的这个前提。建议你“系统”地学习一门你选择的语言。这么问几个问题,就算给你解释了,要嘛忘记,要嘛看得懂字但是不知道含义,要嘛后面还会有更多的问题。推荐你看 Learning Python (中文:《 Python 学习手册》),和《 Python3 程序开发指南》。至于问题:1. 这是脚本语言,所以有“载入时”(“编译”)和运行时的区别,同时对应的代码文件会被设置 __name__ 变量,再具体请看书。2. 并行可以简单理解成“同时”执行代码。可以参考斯坦福大学《编程范式》大约 15~20 课中间有一两课讲解并行编程。3. 简单来讲,多个相同的函数并行执行,可以用 pool。不同函数并行执行,用 process4. 看书。”
======
回复:
可以参考斯坦福大学公开课 --《编程范式》大约 15~20 课中间有一两课讲解并行编程
AlvaIM
2019-08-02 10:22:17 +08:00
楼主其实并不是对语言不了解,而是对计算机的体系结构工作模式操作系统的运行逻辑, 进程, 线程这些系统级别的概念不清晰,这些很多是在学语言的时候被一笔带过了,因为涉及到并行这些概念的教程大多是针对程序员,默认你是经过了系统的计算机科学学习的, 但是实际上并不是
crella
2019-08-02 15:26:33 +08:00
你这个脚本执行子线程的时候主线程不需要干活的话,执行子线程后在主线程监测各个标志子线程已经完成的文件就可以了( If File.exists("result.flag") Then ...)。这么简单的脚本用什么语言都能搞,可以看看 c#的 backgroundworker...
lmingzhi08
2019-08-15 20:30:38 +08:00
最近在研究异步写文件,平常都是用 pandas 来处理数据,其实数据相关的处理推荐看看 python 的 pandas.

然后利用 pandas 的 map 或 apply 应用函数到数据集,比直接用 python 的 for 循环,速度有极大的提升(毕竟 pandas 的底层都是经过优化的)。

如果是计算,应该是 cpu 密集型,用多核 cpu(多进程)加速运算还是可以节约很多时间.

一般可以将独立的一个任务流程封装在一个函数里,然后再应用。这个专门讲 python 并行处理任务的,我觉得挺有参考价值的:
https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/chapter4/02_Using_the_concurrent.futures_Python_modules.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/588388

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX