大数据文摘作品,转载要求见文末
作者 | adam geitgey
编译 | 元元、lisa、saint、aileen
原文链接 | #concurrent.futures.executor.map。
这种方法总能帮我的程序提速吗?
当你有一列数据,并且每个数据都可以独立处理的时候,使用process pools是一个好方法。这有一些适合使用并行处理的例子:
从一系列单独的网页服务器日志里抓取数据。
从一堆xml,csv和json文件中解析数据。
对大量图片数据做预处理,建立机器学习数据集。
但process pools不是万能的。使用process pool需要在独立的python处理过程中将数据来回传递。如果你正在使用的数据不能在处理过程中有效的被传递,这种方法就行不通。你处理的数据必须是python知道怎么搞定的类型(#what-can-be-pickled-and-unpickled)。
同时,数据不会按照一个预想的顺序被处理。如果你需要前一步的处理结果来进行下一步骤,这种方法也行不通。
那gil怎么办?
你可能听说过python有一个全局解释器锁(global interpreter lock,),缩写为gil。这意味着即使你的程序是多层的,每一层也只有一个python命令能被执行。gil确保任何时候都只有一个python线程执行。 gil最大的问题就是python的多线程程序并不能利用多核cpu的优势。
但process pools能解决这个问题!因为我们在运行单独的python实例,每个实例都有自己的gil。这样你就有了真正的并行处理的python代码!
不要害怕并行处理!
有了concurrent.futures库,python可以让你简简单单地修改脚本,却能立刻调用你电脑上所有cpu内核开足马力地运行。不要害怕尝试。一旦你会用了,它就像写一个for循环那样简单,但会让整个程序快很多。