gpt4 book ai didi

python - 为什么将 multiprocessing 与 pandas apply 一起使用会导致如此显着的加速?

转载 作者:太空狗 更新时间:2023-10-30 01:33:02 25 4
gpt4 key购买 nike

假设我有一个 pandas 数据框和一个我想应用于每一行的函数。我可以调用 df.apply(apply_fn, axis=1),这需要的时间与 df 的大小成线性关系。或者我可以拆分 df 并使用 pool.map 在每个片段上调用我的函数,然后连接结果。

我期望使用 pool.map 的加速因子大致等于池中的进程数(如果使用 N 个处理器,则 new_execution_time = original_execution_time/N —— 假设开销为零).

相反,在这个玩具示例中,当使用 4 个处理器时,时间下降到大约 2% (0.005272/0.230757)。我最多期待 25%。发生了什么,我不明白什么?

import numpy as np
from multiprocessing import Pool
import pandas as pd
import pdb
import time

n = 1000
variables = {"hello":np.arange(n), "there":np.random.randn(n)}
df = pd.DataFrame(variables)

def apply_fn(series):
return pd.Series({"col_5":5, "col_88":88,
"sum_hello_there":series["hello"] + series["there"]})

def call_apply_fn(df):
return df.apply(apply_fn, axis=1)

n_processes = 4 # My machine has 4 CPUs
pool = Pool(processes=n_processes)

t0 = time.process_time()
new_df = df.apply(apply_fn, axis=1)
t1 = time.process_time()
df_split = np.array_split(df, n_processes)
pool_results = pool.map(call_apply_fn, df_split)
new_df2 = pd.concat(pool_results)
t2 = time.process_time()
new_df3 = df.apply(apply_fn, axis=1) # Try df.apply a second time
t3 = time.process_time()

print("identical results: %s" % np.all(np.isclose(new_df, new_df2))) # True
print("t1 - t0 = %f" % (t1 - t0)) # I got 0.230757
print("t2 - t1 = %f" % (t2 - t1)) # I got 0.005272
print("t3 - t2 = %f" % (t3 - t2)) # I got 0.229413

我保存了上面的代码并使用 python3 my_filename.py 运行它。

PS 我意识到在这个玩具示例中 new_df 可以以更直接的方式创建,而无需使用应用。我有兴趣将类似的代码与更复杂的 apply_fn 一起应用,而不仅仅是添加列。

最佳答案

编辑(我之前的回答其实是错误的。)

time.process_time() ( doc ) 仅测量当前进程的时间(不包括休眠时间)。因此不考虑花在子进程上的时间。

我用 time.time() 运行你的代码,它测量真实世界的时间(根本没有显示加速)和更可靠的 timeit.timeit(大约 50% 的加速)。我有 4 个核心。

关于python - 为什么将 multiprocessing 与 pandas apply 一起使用会导致如此显着的加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36576850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com