Pandas DataFrame多线程没有性能提升

时间:2018-08-12 14:12:26

标签: python multithreading pandas multiprocessing

我有一个词典(在内存中)data,其中有约10,000个键,每个键代表股票行情记录器,并且该值存储每日股票价格的时间序列数据的熊猫数据帧表示。我正在尝试计算成对的Pearson correlation

代码需要很长时间〜3小时才能完全迭代所有组合O(n^2) ~ C(2, 10000)。我尝试使用multiprocessing虚拟程序包,但完全看不到性能提高(实际上随着工作人员数量的增加而变慢)。

from multiprocessing.dummy import Pool

def calculate_correlation((t1, t2)):
    # pseudo code here
    return pearsonr(data[t1]['Close'], data[t2]['Close'])

todos = []

for idx, t1 in enumerate(list(data.keys())):
    for t2 in list(data.keys())[idx:]:  # only the matrix top triangle
        todos.append((t1, t2))

pool = Pool(4)
results = pool.map(calculate_correlation, todos)
pool.close()
pool.join()

所有数据均已加载到内存中,因此它不应占用大量IO。是否有任何原因导致根本没有性能提升?

1 个答案:

答案 0 :(得分:1)

使用multiprocessing.dummy时,您使用的是线程,而不是进程。对于Python中受CPU限制的应用程序,使用多线程通常不会提高性能。您应该使用多重处理来在Python中并行化代码。因此,如果您从

更改代码
from multiprocessing.dummy import Pool 

from multiprocessing import Pool

这将大大改善您的表现。

以上内容将解决您的问题,但是如果您想知道为什么会这样。请继续阅读:

Python中的多线程具有全局解释器锁(GIL),该锁可防止同一进程中的两个线程同时运行。如果发生大量磁盘IO,则多线程会有所帮助,因为DISK IO是可以处理锁的独立进程。或者,如果您的Python代码使用了可以处理锁的单独应用程序,那么多线程会有所帮助。另一方面,多处理会将CPU的所有内核用作独立的进程,而不是多线程。在像您这样的受CPU约束的Python应用程序中,如果使用多处理而不是多线程,则您的应用程序将在多个内核上的多个进程上并行运行,这将提高应用程序的性能。