V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Thymolblue
V2EX  ›  Python

不懂就问: Python 脚本 并行

  •  
  •   Thymolblue · 2019-08-02 04:58:47 +08:00 · 2937 次点击
    这是一个创建于 1975 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想请教各位 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 看的不太懂,可能是我没有计算机相关的基础吧)
    
    10 条回复    2019-08-15 20:30:38 +08:00
    silkriver
        1
    silkriver  
       2019-08-02 06:57:58 +08:00
    leishi1313
        2
    leishi1313  
       2019-08-02 07:04:54 +08:00
    不常用 multiprocessing,挑着回答下:
    1. 不必须,但这是你能用 python ***.py 跑你代码的充分不必要条件
    2. 并行了之后每个子任务什么时候执行就不是你能决定的了,如果要统计总时间,可以看看.join()
    3. 不清楚
    4. 并行计算挺难的,如果你需求不大,就多写写多问问就好了,想要系统地学习可以搜搜 Parallel Computing,看看有没有公开课什么的
    RHxW
        3
    RHxW  
       2019-08-02 08:12:15 +08:00
    第一个问题是为了区别直接执行和外部引用的吧
    Dilras
        4
    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 中对应的章节,书有开源翻译版
    oahebky
        6
    oahebky  
       2019-08-02 10:10:07 +08:00   ❤️ 1
    基于你需要经常写脚本做事情的这个前提。
    建议你“系统”地学习一门你选择的语言。
    这么问几个问题,就算给你解释了,要嘛忘记,要嘛看得懂字但是不知道含义,要嘛后面还会有更多的问题。

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

    至于问题:
    1. 这是脚本语言,所以有“载入时”(“编译”)和运行时的区别,同时对应的代码文件会被设置 __name__ 变量,再具体请看书。
    2. 并行可以简单理解成“同时”执行代码。可以参考斯坦福大学《编程范式》大约 15~20 课中间有一两课讲解并行编程。
    3. 简单来讲,多个相同的函数并行执行,可以用 pool。不同函数并行执行,用 process
    4. 看书。
    oahebky
        7
    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
        8
    AlvaIM  
       2019-08-02 10:22:17 +08:00   ❤️ 1
    楼主其实并不是对语言不了解,而是对计算机的体系结构工作模式操作系统的运行逻辑, 进程, 线程这些系统级别的概念不清晰,这些很多是在学语言的时候被一笔带过了,因为涉及到并行这些概念的教程大多是针对程序员,默认你是经过了系统的计算机科学学习的, 但是实际上并不是
    crella
        9
    crella  
       2019-08-02 15:26:33 +08:00
    你这个脚本执行子线程的时候主线程不需要干活的话,执行子线程后在主线程监测各个标志子线程已经完成的文件就可以了( If File.exists("result.flag") Then ...)。这么简单的脚本用什么语言都能搞,可以看看 c#的 backgroundworker...
    lmingzhi08
        10
    lmingzhi08  
       2019-08-15 20:30:38 +08:00 via Android
    最近在研究异步写文件,平常都是用 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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.