这是因为“用户”时间是所有CPU时间的总和,我们最终完成工作的CPU时间总和一样,都是9秒,但我们使用4个CPU完成的,实际处理数据时间只有2.2秒!
注意:启用更多Python进程以及给子进程分配数据都会占用时间,因此靠这个方法并不能保证总是能大幅提高速度。如果你要处理非常大的数据集,这里有篇设置将数据集切分成多少小块的文章,可以读读,会对你帮助甚大.
这种方法总能帮我的数据处理脚本提速吗?
如果你有一列数据,并且每个数据都能单独处理时,使用我们这里所说的Process Pools是一个提速的好方法。下面是一些适合使用并行处理的例子:
从一系列单独的网页服务器日志里抓取统计数据。
从一堆XML,CSV和JSON文件中解析数据。
对大量图片数据做预处理,建立机器学习数据集。
但也要记住,Process Pools并不是万能的。使用Process Pool需要在独立的Python处理进程之间来回传递数据。如果你要处理的数据不能在处理过程中被有效地传递,这种方法就行不通了。简而言之,你处理的数据必须是Python知道怎么应对的类型。
同时,也无法按照一个预想的顺序处理数据。如果你需要前一步的处理结果来进行下一步,这种方法也行不通。
那GIL的问题呢?
你可能知道Python有个叫全局解释器锁(Global Interpreter Lock)的东西,即GIL。这意味着即使你的程序是多线程的,每个线程也只能执行一个Python指令。GIL确保任何时候都只有一个Python线程执行。换句话说,多线程的Python代码并不能真正地并行运行,从而无法充分利用多核CPU。
但是Process Pool能解决这个问题!因为我们是运行单独的Python实例,每个实例都有自己的GIL。这样我们获得是真正能并行处理的Python代码!
不要害怕并行处理!
有了concurrent.futures库,Python就能让你简简单单地修改一下脚本后,立刻让你电脑上所有CPU投入到工作中。不要害怕尝试这种方法,一旦你掌握了,它就跟一个for循环一样简单,却能让你的数据处理脚本快到飞起。
我有一个微信公众号,经常会分享一些python技术相关的干货;如果你喜欢我的分享,可以用微信搜索“python语言学习”
关注
欢迎大家加入千人交流答疑裙:699+749+852