في مقال سابق ، نظرنا في بعض الطرق البسيطة لتسريع Pandas من خلال تجميع jit واستخدام نوى متعددة باستخدام أدوات مثل Numba و Pandarallel. سنتحدث هذه المرة عن أدوات أكثر قوة لا يمكنك من خلالها تسريع الباندا فحسب ، بل يمكنك أيضًا تجميعها ، مما يتيح لك معالجة البيانات الضخمة.![](https://habrastorage.org/webt/_m/is/be/_misbehavfd8k1dw5rvds8m31ws.png)
- نومبا
- المعالجة المتعددة
- بانداريال
الجزء 2
أسرع
Swifter — , pandas. — , pandas. pandarallel , Dask, .
:
- ( )
- , - , , swifter .
:
def multiply(x):
return x * 5
, swifter, pandas, , pandarallel:
![](https://habrastorage.org/webt/ht/gw/ch/htgwchedwsksr-1sw-4sqnl4xla.png)
, , swifter , , . , .
, . , swifter:
def mean_word_len(line):
for i in range(6):
words = [len(i) for i in line.split()]
res = sum(words) / len(words)
return res
df['headline_text'].swifter.allow_dask_on_strings().apply(mean_word_len)
:
![](https://habrastorage.org/webt/d3/dq/km/d3dqkmz8vrpgv1ei1ro6deyz7wu.png)
. ( 100 000 ), swifter pandas, . , pandas , , swifter , pandarallel.
Modin
Modin , Dask Ray, . , , . modin dataframe
( pandas), ~80% , 20% pandas, API.
, , env
:
%env MODIN_ENGINE=ray
import modin.pandas as mpd
modin . csv 1.2 GB:
df = mpd.read_csv('abcnews-date-text.csv', header=0)
df = mpd.concat([df] * 15)
df.to_csv('big_csv.csv')
modin pandas:
In [1]: %timeit mpd.read_csv('big_csv.csv', header=0)
8.61 s ± 176 ms per loop (mean ± std. dev. of 5 runs, 1 loop each)
In [2]: %timeit pd.read_csv('big_csv.csv', header=0)
22.9 s ± 1.95 s per loop (mean ± std. dev. of 5 runs, 1 loop each)
3 . , , - . modin :
![](https://habrastorage.org/webt/-4/8q/qd/-48qqdjwzotwyxrcykxmpat2bl4.png)
, apply
— modin, , RAM . , , :
df = pd.DataFrame(np.random.randint(0, 100, size=(10**7, 6)), columns=list('abcdef'))
![](https://habrastorage.org/webt/gn/gn/4q/gngn4qz1ixke0dbwzjwgdahlll8.png)
![](https://habrastorage.org/webt/mr/ti/9-/mrti9-vyjt9-ouyt18ormgsyfr4.png)
? . median
nunique
10**7
, mean
prod(axis=1)
, , pandas 10**8
modin .
- API modin pandas, ,
- , . , 1GB
- — 80%
- , — Ray/Dask modin
- , ,
- Ray Dask . Ray:
![](https://habrastorage.org/webt/af/iq/qt/afiqqtkqpwuv1tdpt_jp0tp8h0y.png)
Dask
Dask — . , . numpy pandas, — dask sklearn xgboost, . , . pandas.
dask — .
from distributed import Client
client = Client(n_workers=8)
Dask, modin, dataframe
, :
import dask.dataframe as dd
. :
In [1]: %timeit dd.read_csv('big_csv.csv', header=0)
6.79 s ± 798 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [2]: %timeit pd.read_csv('big_csv.csv', header=0)
19.8 s ± 2.75 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
Dask - 3 . — apply
. pandarallel swifter, :
dd.from_pandas(df, npartitions=8).apply(mean_word_len, meta=(float)).compute(),
![](https://habrastorage.org/webt/zl/ou/6a/zlou6a_s3c9lvpjs5rgosjqizh8.png)
, dask , 10**4
. :
df = pd.DataFrame(np.random.randint(0, 100, size=(10**7, 6)), columns=list('abcdef'))
![](https://habrastorage.org/webt/g2/cq/3-/g2cq3-uwm4xwl8adm5gkdfiwici.png)
![](https://habrastorage.org/webt/mj/my/l9/mjmyl9m_hzv8bq5ludsjd4riui4.png)
modin, , . axis=0
, , >10**8
dask . axis=1
pandas ( quantile(axis=1)
).
, pandas , , dask — , , pandas ( , RAM).
apply
- . , .
- ,
- API dask pandas, , Dask
- :
![](https://habrastorage.org/webt/j-/fy/hh/j-fyhhrnlt_m2z1vyqk-j41iyy0.png)
Conclusion
, , . , Dask, : ? ? ? , , .
! , !
![صورة](https://habrastorage.org/getpro/habr/post_images/cce/de3/857/ccede38572c83d1a6359392a46486d42.gif)
P.s Trust, but verify — , ( ), github