但方法的改進上難免會遇到上限瓶頸,比如數據非常大的時候。最近看到了一篇也是關於對pandas提速的文章,但是從另一個角度,工具。使用它可以很好的突破操作優化上的瓶頸,而這個工具就是Modin。
Modin存在的意義就是:更改一行代碼來提速pandas工作流程。
Pandas在數據科學領域就無需介紹了,它提供高性能,易於使用的數據結構和數據分析工具。但是,在處理過多的數據時,單核上的Pandas就顯得心有餘而力不足了,大家不得不求助於不同的分布式系統來提高性能。然而,提高性能的權衡伴隨著陡峭的學習曲線。從本質上講,用戶可能只是希望Pandas運行得更快,並不希望對其特定的硬體設置優化其工作流程。這意味著大家希望使用相同Pandas腳本作用於10KB數據集和10TB數據集。 Modin對優化pandas提供了解決方案,以便數據科學家可以花更多時間從數據中提取價值,而不是在工具上。
Modin
Modin是加州大學伯克利分校RISELab的早期項目,旨在促進分布式計算在數據科學中的應用。它是一個多進程Dataframe庫,具有與pandas相同的API,允許用戶加速其Pandas工作流程。
Modin在8核計算機上將Pandas查詢加速4倍,只需要用戶更單行代碼。該系統專為現有的Pandas用戶而設計,他們希望程序能夠更快地運行並且無需重大代碼更改即可更好地擴展。這項工作的最終目標是能夠在雲設置中使用Pandas。
安裝
Modin是完全開源的,可以在GitHub上找到:
https://github.com/modin-project/modin
Modin可以從PyPI安裝:
pip install modin
對於Windows,其中一個依賴項是Ray。在Windows上本身尚不支持Ray,因此為了安裝它,需要使用WSL(適用於Linux的Windows子系統)。
Modin是如何加速運行的?
在筆記本電腦上
考慮一款4核現代筆記本電腦,dateframe可以很好地適用其上。pandas只使用其中一個CPU核,但是,modin確使用了所有的核。
pandas vs modin CPU核使用對比
modin所做的基本上就是增加了CPU所有內核的利用率,從而提供了更好的性能。
在一個更大型機器上
在大型機器上,modin的有利用率變得更加明顯。讓我們假裝有一些伺服器或一些非常強大的機器。pandas仍將使用單核,而modin將使用全部核。以下是144核心計算機上read_csv操作下,pandas和modin的性能比較。
pandas有一個很明顯的線性增長,這是因為它一直只使用一個核。可能很難看到綠色條紋,因為modin的運行時間非常短。
Modin的架構
我們來看看Modin的架構。
DataFrame分區
分區模式沿著列和行分區,因為它在列數和支持的行數方面給Modin提供了靈活性和可伸縮性。
系統架構
Modin被分成不同的層:
Pandas API暴露在最頂層。
下一層包含查詢編譯器,它從pandas API層接收查詢並執行某些優化。
最後一層是分區管理器,負責數據布局和洗牌,分區和序列化發送到每個分區的任務。
modin的標準架構
在Modin中實現pandas API
pandas API是非常多的,這可能是它具有如此廣泛的應用的原因。
pandas API
在這麼多的操作下,modin遵循了一種數據驅動的方法。意思是說modin的創造者分析了一下大多數人在pandas中所使用的操作。他們去了Kaggle並對那裡出現的腳本和筆記進行了大量搜索,並最終弄明白了最受歡迎的pandas方法如下:
pd.read_csv是目前pandas中使用最多的方法,其次是pd.Dataframe。因此,在modin中,他們開始實現這些方法並按照它們的受歡迎程度對它們進行優化:
目前,modin支持大約71%的pandas API。
這代表了基於該研究的約93%的使用量。
Ray
Modin使用Ray提供了一種省事兒的方式來加速pandas的notebooks,腳本和庫。Ray是一個高性能的分布式執行框架,面向大規模機器學習和強化學習應用程式。可以在單個機器上運行相同的代碼以實現高效的多進程處理,並且可以在群集上使用它來進行大型計算。你可以在GitHub上找到Ray:
https://github.com/ray-project/ray
Usage
Importing
Modin包裝了pandas並透明地分發數據和計算,通過一行代碼更改加速了pandas的工作流程。用戶繼續使用以前的pandas notebooks,同時可以體驗到Modin的相當大的加速,即使在一臺機器上也是如此。只需要修改import語句,其中需要導入modin.pandas而不是簡單的pandas。
import numpy as np
import modin.pandas as pd
我們使用由隨機整數組成的Numpy構建一個數據集。注意,我們不必在此處指定分區。
當我們列印出類型時,它是一個Modin的數據框。
type(df)
如果我們用head命令列印出前5行,它會像pandas一樣呈現HTML表。
df.head()
對比
Modin管理數據分區和洗牌,以便用戶可以專注於從數據中提取值。以下代碼在具有32GB RAM的2013年4核iMac上運行。
pd.read_csv
read_csv是迄今為止最常用的pandas操作。當我們在pandas vs modin中使用read_csv時,可以快速地比較出來。
pandas
%%time
import pandas
pandas_csv_data = pandas.read_csv("../800MB.csv")
CPU times: user 26.3 s, sys: 3.14 s, total: 29.4s
Wall time: 29.5 s
Modin
%%time
modin_csv_data = pd.read_csv("../750MB.csv")
CPU times: user 76.7 ms, sys: 5.08 ms, total: 81.8 ms
Wall time: 7.6 s
使用Modin,只需更改import語句,read_csv在4核計算機上的運行速度可提高4倍。
df.groupby
pandas groupby編寫得非常好,速度非常快。但即便如此,modin仍然勝過pandas。
pandas
%%time
import pandas
_ = pandas_csv_data.groupby(by=pandas_csv_data.col_1).sum()
CPU times: user 5.98 s, sys: 1.77 s, total: 7.75 s
Wall time: 7.74 s
Modin
%%time
results = modin_csv_data.groupby(by=modin_csv_data.col_1).sum()
CPU times: user 3.18 s, sys: 42.2 ms, total: 3.23 s
Wall time: 7.3 s
默認為pandas實現
如果想要使用尚未實現或優化的pandas API,實際上可以默認使用pandas。這使得該系統可用於使用尚未在Modin中實現操作的notebooks,即使性能會因為使用pandas API而下降。當默認為pandas時,你會看到一個警告:
dot_df = df.dot(df.T)
一旦計算完成,它將返回分布式Modin DataFrame。
type(dot_df)
--
結論
Modin仍然處於早期階段,似乎是對pandas非常有前途的補充。Modin處理用戶的所有分區和混洗,以便我們可以專注於我們的工作流程。Modin的基本目標是使用戶能夠在小數據和大數據上使用相同的工具,而無需擔心更改API以適應不同的數據大小。
來源:
https://towardsdatascience.com/get-faster-pandas-with-modin-even-on-your-laptops-b527a2eeda74
https://rise.cs.berkeley.edu/blog/modin-pandas-on-ray-october-2018/
專注於數據科學領域的知識分享
歡迎在文章下方留言與交流
Python數據科學【讀者福利】