Pandas、Concurrent.Futures和GIL

4
我正在使用Pandas 0.18/Python 3.5编写代码,运行在一台四核Intel i3的电脑上。我读过这篇文章:https://www.continuum.io/content/pandas-releasing-gil,同时我的工作主要是IO绑定的(将CSV文件解析成数据框),需要大量计算,而这些计算主要是在数据框内进��的乘法操作。
目前,我正在使用concurrent.futures ThreadPoolExecutor并行执行代码。我的问题是:
通常情况下,我应该使用线程来并行运行pandas任务,还是pandas会自动有效地利用所有的CPU核心,不需要我显式地告诉它呢?如果是后者,那么我会逐个执行我的任务。
1个回答

5
据我从文档中了解到,pandas仅仅在某些操作中释放GIL(全局解释器锁): 我们在一些cython操作上释放了全局解释器锁(GIL)。这将允许其他线程在计算过程中同时运行,可能会从多线程中获得性能提升。特别是groupbynsmallestvalue_counts和一些索引操作可以受益于此。
所有这意味着的是,当pandas进行计算时,Python解释器可以执行其他线程。这并不意味着pandas自动跨多个线程扩展计算。他们在文档中也稍微提到了这一点:
释放GIL可能有利于使用线程进行用户交互(例如QT)或执行多线程计算的应用程序。
为了获得并行化的好处,您需要在自己的代码中实际创建和执行多个线程。因此,如果您正在尝试在应用程序中实现并行执行,则应继续使用ThreadPoolExecutor
请记住,pandas仅在一些操作中释放GIL,因此,如果您没有调用任何实际释放它的方法,您可能无法通过多线程获得性能提升。

1
更新GIL的pandas文档链接:https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.17.0.html?highlight=gil#whatsnew-0170-gil - Laszlo Treszkai
@LaszloTreszkai 谢谢,我已经更新了我的答案以使用该链接。 - dano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接