如何在 Python 3.7 中快速并行化函数?

Posted

技术标签:

【中文标题】如何在 Python 3.7 中快速并行化函数?【英文标题】:How to Parallize the function fastly in Python 3.7? 【发布时间】:2020-07-18 06:00:43 【问题描述】:

我有一个包含 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()

【问题讨论】:

scipy.signal.argrelextrema 可能对这项任务有帮助。它已经被矢量化了,因此应该很快。 @cel 谢谢,我怎样才能在这个中使用我自己的函数 maxloc? 【参考方案1】:

这是一个使用 scipy.signal.argrelextrema 的 maxloc 实现,并且速度要快得多(在本例中超过 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)

【讨论】:

谢谢,当我运行代码时,它给了我这个错误 loc_max[loc_opt_ind] = 1 IndexError: too many indices for array, As I used df.values to change DataFrame into array

以上是关于如何在 Python 3.7 中快速并行化函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 多线程并行化来自另一个模块的函数而不进行酸洗?

如何使用 python Ray 在一个大列表上并行化?

使用 Python 3.7+ 进行 100k API 调用,使用 asyncio 并行进行 100 [重复]

如何使用 PySpark 并行化我的文件处理程序

使用 C 和并行化在 R 中快速关联

使用 CUDA 在 python 中展开一个可并行化的 for 循环