Nhảy tới nội dung

Tối ưu hóa tốc độ lặp

So sánh các phương pháp lặp


def vectorizer(df):
prices = df['Item_Outlet_Sales'] * 0.5

def applyer(df):
prices = df['Item_Outlet_Sales'].apply(lambda x: x * 0.5)

def iterrows(df):
prices = []
for i, row in df.iterrows():
prices.append(row['Item_Outlet_Sales'] * 0.5)

def itertuples1(df):
prices = []
for row in df.itertuples():
prices.append(row.Item_Outlet_Sales * 0.5)

def itertuples2(df):
prices = []
for row in df.itertuples(index=False, name=None):
prices.append(row[5] * 0.5)
%timeit -n 10 vectorizer(df)
80.1 µs ± 42.8 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit -n 10 applyer(df)
1.37 ms ± 112 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit -n 10 iterrows(df)
256 ms ± 2.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit -n 10 itertuples1(df)
6.61 ms ± 200 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit -n 10 itertuples2(df)
3.91 ms ± 132 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Xử lý song song trong pandas

Xử lý song song là phương pháp tận dụng số lượng core của CPU để giải quyết vấn đề trong thời gian ngắn hơn.

pandarallel

Để cài đặt pandarallel bằng pip

pip install pandarallel

Cách sử dụng

from pandarallel import pandarallel
pandarallel.initialize(progress_bar=True, n_workers=4)

Để thiết lập cho pandarallel ta dùng .initialize. Trong đó:

  • n_workers: là số lượng cores của CPU

  • progress_bar: show tiến trình

Để áp dụng pandarallel ta chỉ việc thay thế .apply bằng .parallel_apply

# df.apply(func)
df.parallel_apply(func)

Dask

Dask là một thư viện tính toán song song cho Python.

Để cài đặt dask bằng pip

pip install dask

Cách sử dụng

import dask.dataframe as dd
dd.read_csv('data/big_mart_sales.csv')