歡迎光臨
每天分享高質量文章

嫌pandas慢又不想改程式碼怎麼辦?來試試Modin

(點選上方快速關註並設定為星標,一起學Python)

來源:Python資料科學  連結:

https://mp.weixin.qq.com/s/SlPdbGtdtfXGPPKrysM7kw

之前和大家分享過一篇關於提速pandas的文章,主要是在pandas的具體操作用法上提出了一些改進,還在抱怨pandas執行速度慢?這幾個方法會顛覆你的看法

但方法的改進上難免會遇到上限瓶頸,比如資料非常大的時候。最近看到了一篇也是關於對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構建一個資料集。註意,我們不必在此處指定分割槽。

ata = np.random.randint(0,100,size = (2**16, 2**4))
df = pd.DataFrame(data)
df = df.add_prefix("Col:")

當我們打印出型別時,它是一個Modin的資料框。

type(df)

modin.pandas.dataframe.DataFrame

如果我們用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.dataframe.DataFrame

 

結論

 

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/

    已同步到看一看
    贊(0)

    分享創造快樂