Python提高運行速度工具之Pandarallel的使用教程
眾所周知,由于 GIL 的存在,Python 單進(jìn)程中的所有操作都是在一個CPU核上進(jìn)行的,所以為了提高運行速度,我們一般會采用多進(jìn)程的方式。而多進(jìn)程無非就是以下幾種方案:
- multiprocessing
- concurrent.futures.ProcessPoolExecutor()
- joblib
- ppserver
- celery
這些方案對于普通 python 玩家來說都不是特別友好,怎樣才能算作一個友好的并行處理方案?
那就是原來的邏輯我基本不用變,僅修改需要計算的那行就能完成我們目標(biāo)的方案,而 pandarallel 就是一個這樣友好的工具。

可以看到,在 pandarallel 的世界里,你只需要替換原有的 pandas 處理語句就能實現(xiàn)多CPU并行計算。非常方便、非常nice.

在4核CPU的性能測試上,它比原始語句快了接近4倍。測試條件(OS: Linux Ubuntu 16.04,Hardware: Intel Core i7 @ 3.40 GHz - 4 cores),這就是我所說的,它把CPU充分利用了起來。
下面就給大家介紹這個模塊怎么用,其實非常簡單,任何代碼只需要加幾行代碼就能實現(xiàn)質(zhì)的飛躍。
1.準(zhǔn)備
開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上
pip install pandarallel
2.使用 Pandarallel
使用前,需要對Pandarallel進(jìn)行初始化:
from pandarallel import pandarallel pandarallel.initialize()
這樣才能調(diào)用并行計算的API,不過 initialize 中有一個重要參數(shù)需要說明,那就是 nb_workers ,它將指定并行計算的Worker數(shù),如果沒有設(shè)置,所有CPU的核都會用上。
Pandarallel一共支持8種Pandas操作,下面是一個apply方法的例子。
import pandas as pd
import time
import math
import numpy as np
from pandarallel import pandarallel
# 初始化
pandarallel.initialize()
df_size = int(5e6)
df = pd.DataFrame(dict(a=np.random.randint(1, 8, df_size),
b=np.random.rand(df_size)))
def func(x):
return math.sin(x.a**2) + math.sin(x.b**2)
# 正常處理
res = df.apply(func, axis=1)
# 并行處理
res_parallel = df.parallel_apply(func, axis=1)
# 查看結(jié)果是否相同
res.equals(res_parallel)
其他方法使用上也是類似的,在原始的函數(shù)名稱前加上 parallel_,比如 DataFrame.groupby.apply:
import pandas as pd
import time
import math
import numpy as np
from pandarallel import pandarallel
# 初始化
pandarallel.initialize()
df_size = int(3e7)
df = pd.DataFrame(dict(a=np.random.randint(1, 1000, df_size),
b=np.random.rand(df_size)))
def func(df):
dum = 0
for item in df.b:
dum += math.log10(math.sqrt(math.exp(item**2)))
return dum / len(df.b)
# 正常處理
res = df.groupby("a").apply(func)
# 并行處理
res_parallel = df.groupby("a").parallel_apply(func)
res.equals(res_parallel)
又比如 DataFrame.groupby.rolling.apply:
import pandas as pd
import time
import math
import numpy as np
from pandarallel import pandarallel
# 初始化
pandarallel.initialize()
df_size = int(1e6)
df = pd.DataFrame(dict(a=np.random.randint(1, 300, df_size),
b=np.random.rand(df_size)))
def func(x):
return x.iloc[0] + x.iloc[1] ** 2 + x.iloc[2] ** 3 + x.iloc[3] ** 4
# 正常處理
res = df.groupby('a').b.rolling(4).apply(func, raw=False)
# 并行處理
res_parallel = df.groupby('a').b.rolling(4).parallel_apply(func, raw=False)
res.equals(res_parallel)
案例都是類似的,這里就直接列出表格,不浪費大家寶貴的時間去閱讀一些重復(fù)的例子了:

3.注意事項
1. 我有 8 個 CPU,但 parallel_apply 只能加快大約4倍的計算速度。為什么?
答:正如我前面所言,Python中每個進(jìn)程占用一個核,Pandarallel 最多只能加快到你所擁有的核心的總數(shù),一個 4 核的超線程 CPU 將向操作系統(tǒng)顯示 8 個 CPU,但實際上只有 4 個核心,因此最多加快4倍。
2. 并行化是有成本的(實例化新進(jìn)程,通過共享內(nèi)存發(fā)送數(shù)據(jù),…),所以只有當(dāng)并行化的計算量足夠大時,并行化才是有意義的。對于很少量的數(shù)據(jù),使用 Pandarallel 并不總是值得的。
到此這篇關(guān)于Python提高運行速度工具之Pandarallel的使用教程的文章就介紹到這了,更多相關(guān)Python Pandarallel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?matplotlib?seaborn繪圖教程詳解
Seaborn是在matplotlib的基礎(chǔ)上進(jìn)行了更高級的API封裝,從而使得作圖更加容易,在大多數(shù)情況下使用seaborn就能做出很具有吸引力的圖。本文將詳細(xì)講解如何利用Seaborn繪制圖表,需要的可以參考一下2022-03-03
springboot整合單機(jī)緩存ehcache的實現(xiàn)
本文主要介紹了springboot整合單機(jī)緩存ehcache的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python實現(xiàn)準(zhǔn)確獲取PDF文件中的標(biāo)題
想要在PDF文件中,解析獲取全部的標(biāo)題,是一件比較麻煩的事情,這篇文章將介紹一種較為準(zhǔn)確的提取標(biāo)題的方式,感興趣的小伙伴可以了解一下2024-02-02
VSCode運行或調(diào)試python文件無反應(yīng)的問題解決
這篇文章主要給大家介紹了關(guān)于VSCode運行或調(diào)試python文件無反應(yīng)的問題解決,使用VScode編譯運行C/C++沒有問題,但是運行Python的時候出了問題,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-07-07
python網(wǎng)絡(luò)編程之進(jìn)程詳解
這篇文章主要為大家介紹了python網(wǎng)絡(luò)編程之進(jìn)程,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01

