Как быстро парализовать функцию в Python 3.7? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть список из 200 DataFrames, и я пытаюсь применить функцию, но. Я пытаюсь применить параллельную функцию в python для ускорения, но не могу получить желаемых результатов. Ниже мой код данных представляет собой список 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()

1 Ответ

0 голосов
/ 06 апреля 2020

Вот реализация maxlo c, которая использует 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)
...