本文示例程式碼已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
大家好我是費老師,前兩天pandas
正式釋出了其2.0.0
版本,作為一次大版本更新,pandas
針對底層進行了大量的重構以最佳化效能和穩定性,其有關這次更新內容的說明文件更是洋洋灑灑非常繁雜。
我們作為日常使用pandas
的使用者,並不需要了解過多底層更新內容,只需要學習如何使用新版pandas
為自己提質提效就行,今天的文章話不多說,直接帶大家速通新版pandas
乾貨內容?。
2 速通pandas 2.0新版本乾貨內容
為了下文中方便進行演示,我們建立新的虛擬環境來測試新版pandas
效能表現:
conda create -n pandas2.0-test python=3.8 -y
conda activate pandas2.0-test
pip install pandas pyarrow jupyterlab
2.1 資料讀取及運算效能提升
我們對新版pandas
的最大期待就是1個字——快,因為經過15年的發展,pandas
的分析功能已經相當豐富,API語法也足夠簡單高效,但在處理較大型資料集時的速度和記憶體佔用屬實捉急。
因此新版pandas
引入了基於高效能運算庫arrow
的一系列常用資料型別,作為對預設基於numpy
的資料型別的代替。
我們測試使用到的資料集來自(https://www.kaggle.com/datasets/kartik2112/fraud-detection
),針對其中的fraudTrain.csv
檔案進行讀取,這個檔案大小為三百多兆,我們分別採用3種不同的方式進行讀取:
可以看到,新版pandas
中最優的引數組合,足足比預設的引數快了將近20倍?,檢視使用pyarrow
資料型別後端讀入的資料框,可以發現型別都已經切換到pyarrow
的常用型別:
得益於新的資料型別支援,很多常用的運算操作都要比預設情況下快上很多,其中數值型運算提升幅度很小,但是針對字元型的提升幅度相當大,如下面例子中的startswith()
判斷就快了接近50倍:
2.2 “修改時複製”機制
“修改時複製”作為一種最佳化機制,在1.5
版本中開始引入pandas
,並在2.0
中對pandas
中大多數運算操作進行了支援,且很有可能在3.0
版本中作為預設的策略。
一言以蔽之,“修改時複製”機制就是一種惰性複製機制,可以幫助我們在運算過程中自動避免很多不必要的資料複製操作,下面我們來看一些例子:
在預設情況下,如果我們像下面這樣將df
的field1
列直接賦值給了field1
,再對field1
中的值進行修改,就會導致原先的df
中的對應值也被修改了,這種機制本意是避免賦值時頻繁的資料複製佔用記憶體,但很容易讓我們不小心篡改了原始資料:
而“修改時複製”機制,則會在頻繁複制資料,和避免篡改資料之間進行兼顧(當前版本需要設定全域性引數mode.copy_on_write
為True
以啟用):
也就是說,新版pandas
中的“修改時複製”機制,會自動檢測從源資料中衍生出的資料自身是否發生了值修改,並在修改時才進行資料複製操作,保證了分析過程的高效性和穩定性?。
除了上述介紹的內容外,新版pandas
還進行了大量的效能最佳化更新,這些更新無需我們改變過去的pandas
寫法,而是在我們的日常使用過程中”潤物細無聲“地幫我們節省了計算開銷,可以說,作為pandas
老使用者,切換到2.0
版本的過程是無痛且絲滑的?,大家可以放心地進行更新,更多更新內容細節請移步https://pandas.pydata.org/docs/whatsnew/v2.0.0.html
。
以上就是本文的全部內容,歡迎在評論區與我進行討論~