我有一个数据框,我执行一些操作并打印出来。为此,我必须遍历每一行。
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)
然而,后者(并行化)方法比基于简单迭代的方法慢。有什么我想念的吗?
谢谢!
答案 0 :(得分:6)
除非实际操作花费大量时间,例如每行 ,否则在单个进程中执行此操作将方式效率低下。
通常并行化是框中的最后一个工具。在进行分析之后,在局部向量化之后,在局部优化之后,然后进行并行化。
你花时间做切片,然后开始新的流程(这通常是一个不变的开销),然后腌制一行(不清楚你的例子有多大)。
至少,你应该对行进行分块,例如: df.iloc[i:(i+1)*chunksize]
。
希望在0.14中支持并行apply
,请参见此处:https://github.com/pydata/pandas/issues/5751