我需要基于对选定值列表的处理(以下代码中的{df0['parcels'].values
)来更新pandas数据框列。该代码运行良好,但很长,因为所选值的列表相当长,包含45000个值。该代码需要5个小时才能完成任务。
因为对每个选定值的处理都是独立的。我想尝试并行化以提高速度。
import numpy as np
import pandas as pd
from scipy.ndimage import distance_transform_edt as edt
for i in df0['parcels'].values:
y, x = np.where(parcels == i)
tmp = parcels[np.min(y) - 5:np.max(y) + 6, np.min(x) - 5:np.max(x) + 6]
dst = edt(tmp, sampling=r_parcels)
par = tmp[dst <= 20]
par = par[par != -9999]
mod, cnt = ss.mode(par)
df['parcels'] = df['parcels'].replace(i, mod[0])
答案 0 :(得分:0)
您可以使用多处理中提供的池进行并行化。
import numpy as np
import pandas as pd
from scipy.ndimage import distance_transform_edt as edt
import multiprocessing as mp
def func(i): # change the body of the loop to function
y, x = np.where(parcels == i)
tmp = parcels[np.min(y) - 5:np.max(y) + 6, np.min(x) - 5:np.max(x) + 6]
dst = edt(tmp, sampling=r_parcels)
par = tmp[dst <= 20]
par = par[par != -9999]
mod, cnt = ss.mode(par)
return (df['parcels'].replace(i, mod[0]))
num_workers = mp.cpu_count()
pool = mp.Pool(num_workers)
df['parcels'] = pool.map(func,df0['parcels'].values) # specify the function and arguments to map
pool.close()
pool.join()
您也可以使用 pool.map_async()或 pool.apply_async(),因为 map()正在阻止。通常,并行化的逻辑保持不变。