如何在 Python 3.7 中更快地并行化函数?
How to Parallize the function fastly in Python 3.7?
我有一个包含 200 个 DataFrame 的列表,我正在尝试应用一个函数,但是。我正在尝试在 python 中应用并行函数来加速,但无法获得所需的结果。
下面是我的代码
data 是具有相同列和行但不同值的 DataFrame 列表
import pandas as pd
import multiprocessing as mp
def maxloc(data):
data['loc_max'] = np.zeros(len(data))
for i in range(1,len(data)-1):
if data['value'][i] >= data['value'][i-1] and data['value'][i] >= data['value'][i+1]:
data['loc_max'][i] = 1
return data
pool = mp.Pool(mp.cpu_count())
results = pool.map(maxloc, [row for row in data])
pool.close()
pool.join()
这里是 maxloc 的一个实现,它使用 scipy.signal.argrelextrema 并且速度快得多(在此示例中超过 1000 倍):
import pandas as pd
from scipy.signal import argrelextrema
np.random.seed(42)
def maxloc(data):
data['loc_max'] = np.zeros(len(data))
for i in range(1,len(data)-1):
if data['value'][i] >= data['value'][i-1] and data['value'][i] >= data['value'][i+1]:
data['loc_max'][i] = 1
return data
def maxloc_faster(data):
loc_opt_ind = argrelextrema(df.value.to_numpy(), np.greater)
loc_max = np.zeros(len(data))
loc_max[loc_opt_ind] = 1
data['loc_max'] = loc_max
return data
我们来测试一下
values = np.random.rand(10000)
df = pd.DataFrame({'value': values})
np.all(maxloc_faster(df).loc_max == maxloc(df).loc_max)
# True
%timeit maxloc(df)
# 672 ms ± 39.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit maxloc_faster(df)
# 268 µs ± 12.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
我有一个包含 200 个 DataFrame 的列表,我正在尝试应用一个函数,但是。我正在尝试在 python 中应用并行函数来加速,但无法获得所需的结果。 下面是我的代码 data 是具有相同列和行但不同值的 DataFrame 列表
import pandas as pd
import multiprocessing as mp
def maxloc(data):
data['loc_max'] = np.zeros(len(data))
for i in range(1,len(data)-1):
if data['value'][i] >= data['value'][i-1] and data['value'][i] >= data['value'][i+1]:
data['loc_max'][i] = 1
return data
pool = mp.Pool(mp.cpu_count())
results = pool.map(maxloc, [row for row in data])
pool.close()
pool.join()
这里是 maxloc 的一个实现,它使用 scipy.signal.argrelextrema 并且速度快得多(在此示例中超过 1000 倍):
import pandas as pd
from scipy.signal import argrelextrema
np.random.seed(42)
def maxloc(data):
data['loc_max'] = np.zeros(len(data))
for i in range(1,len(data)-1):
if data['value'][i] >= data['value'][i-1] and data['value'][i] >= data['value'][i+1]:
data['loc_max'][i] = 1
return data
def maxloc_faster(data):
loc_opt_ind = argrelextrema(df.value.to_numpy(), np.greater)
loc_max = np.zeros(len(data))
loc_max[loc_opt_ind] = 1
data['loc_max'] = loc_max
return data
我们来测试一下
values = np.random.rand(10000)
df = pd.DataFrame({'value': values})
np.all(maxloc_faster(df).loc_max == maxloc(df).loc_max)
# True
%timeit maxloc(df)
# 672 ms ± 39.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit maxloc_faster(df)
# 268 µs ± 12.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)