在pandas数据帧上并行化操作时速度慢

时间:2014-03-18 00:40:18

标签: python loops pandas

我有一个数据框,我执行一些操作并打印出来。为此,我必须遍历每一行。

for count, row in final_df.iterrows():
    x = row['param_a']
    y = row['param_b']
    # Perform operation
    # Write to output file

我决定使用python多处理模块

来并行化
def write_site_files(row):
    x = row['param_a']
    y = row['param_b']
    # Perform operation
    # Write to output file

pkg_num = 0
total_runs = final_df.shape[0] # Total number of rows in final_df
threads = []

import multiprocessing

while pkg_num < total_runs or len(threads):
    if(len(threads) < num_proc and pkg_num < total_runs):
        print pkg_num, total_runs
        t = multiprocessing.Process(target=write_site_files,args=[final_df.iloc[pkg_num],pkg_num])
        pkg_num = pkg_num + 1
        t.start()
        threads.append(t)
    else:
        for thread in threads:
            if not thread.is_alive():
               threads.remove(thread)

然而,后者(并行化)方法比基于简单迭代的方法慢。有什么我想念的吗?

谢谢!

1 个答案:

答案 0 :(得分:6)

除非实际操作花费大量时间,例如每行 ,否则在单个进程中执行此操作将方式效率低下。

通常并行化是框中的最后一个工具。在进行分析之后,在局部向量化之后,在局部优化之后,然后进行并行化。

你花时间做切片,然后开始新的流程(这通常是一个不变的开销),然后腌制一行(不清楚你的例子有多大)。

至少,你应该对行进行分块,例如: df.iloc[i:(i+1)*chunksize]

希望在0.14中支持并行apply,请参见此处:https://github.com/pydata/pandas/issues/5751