日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Pandarallel 一個(gè)能讓你的Pandas計(jì)算火力拉滿的工具

 禁忌石 2022-11-19 發(fā)布于浙江

沒(méi)有使用
Pandarallel

文章圖片1

使用了
Pandarallel

文章圖片2

眾所周知,由于GIL的存在,Python單進(jìn)程中的所有操作都是在一個(gè)CPU核上進(jìn)行的,所以為了提高運(yùn)行速度,我們一般會(huì)采用多進(jìn)程的方式。而多進(jìn)程無(wú)非就是以下幾種方案:

  • multiprocessing

  • concurrent.futures.ProcessPoolExecutor()

  • joblib

  • ppserver

  • celery

這些方案對(duì)于普通Pandas玩家來(lái)說(shuō)都不是特別友好,怎樣才能算作一個(gè)友好的并行處理方案?

那就是原來(lái)的邏輯我基本不用變,僅修改需要計(jì)算的那行就能完成我們目標(biāo)的方案,而 pandarallel 就是一個(gè)這樣友好的工具。

沒(méi)有并行計(jì)算(原始pandas)

pandarallel

df.apply(func)

df.parallel_apply(func)

df.applymap(func)

df.parallel_applymap(func)

df.groupby(args).apply(func)

df.groupby(args).parallel_apply(func)

df.groupby(args1).col_name.rolling(args2).apply(func)

df.groupby(args1).col_name.rolling(args2).parallel_apply(func)

df.groupby(args1).col_name.expanding(args2).apply(func)

df.groupby(args1).col_name.expanding(args2).parallel_apply(func)

series.map(func)

series.parallel_map(func)

series.apply(func)

series.parallel_apply(func)

series.rolling(args).apply(func)

series.rolling(args).parallel_apply(func)

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

文章圖片3

在4核CPU的性能測(cè)試上,它比原始語(yǔ)句快了接近4倍。測(cè)試條件(OS: Linux Ubuntu 16.04,Hardware: Intel Core i7 @ 3.40 GHz - 4 cores),這就是我所說(shuō)的,它把CPU充分利用了起來(lái)。

下面就給大家介紹這個(gè)模塊怎么用,其實(shí)非常簡(jiǎn)單,任何代碼只需要加幾行代碼就能實(shí)現(xiàn)質(zhì)的飛躍。

1.準(zhǔn)備

首先需要你的電腦安裝好了Python環(huán)境,并且安裝好了Python開(kāi)發(fā)工具。

如果你還沒(méi)有安裝,可以參考以下文章:

如果僅用Python來(lái)處理數(shù)據(jù)、爬蟲(chóng)、數(shù)據(jù)分析或者自動(dòng)化腳本、機(jī)器學(xué)習(xí)等,建議使用Python基礎(chǔ)環(huán)境+jupyter即可,安裝使用參考Windows/Mac 安裝、使用Python環(huán)境+jupyter notebook

如果想利用Python進(jìn)行web項(xiàng)目開(kāi)發(fā)等,建議使用Python基礎(chǔ)環(huán)境+Pycharm,安裝使用參考 :Windows下安裝、使用Pycharm教程,這下全了Mac下玩轉(zhuǎn)Python-安裝&使用Python/PyCharm 。

請(qǐng)選擇以下任一種方式輸入命令安裝依賴
1. Windows 環(huán)境 打開(kāi) Cmd (開(kāi)始-運(yùn)行-CMD)。
2. MacOS 環(huán)境 打開(kāi) Terminal (command+空格輸入Terminal)。
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.

pip install pandarallel

對(duì)于windows用戶,有一個(gè)不好的消息是,它只能在Windows的linux子系統(tǒng)上運(yùn)行(WSL),你可以在微軟官網(wǎng)上找到安裝教程:

https://docs.microsoft.com/zh-cn/windows/wsl/about

2.使用Pandarallel

使用前,需要對(duì)Pandarallel進(jìn)行初始化:

from pandarallel import pandarallel
pandarallel.initialize()

這樣才能調(diào)用并行計(jì)算的API,不過(guò) initialize 中有一個(gè)重要參數(shù)需要說(shuō)明,那就是 nb_workers ,它將指定并行計(jì)算的Worker數(shù),如果沒(méi)有設(shè)置,所有CPU的核都會(huì)用上。

Pandarallel一共支持8種Pandas操作,下面是一個(gè)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èi)大家寶貴的時(shí)間去閱讀一些重復(fù)的例子了:

沒(méi)有并行計(jì)算(原始pandas)

pandarallel

df.apply(func)

df.parallel_apply(func)

df.applymap(func)

df.parallel_applymap(func)

df.groupby(args).apply(func)

df.groupby(args).parallel_apply(func)

df.groupby(args1).col_name.rolling(args2).apply(func)

df.groupby(args1).col_name.rolling(args2).parallel_apply(func)

df.groupby(args1).col_name.expanding(args2).apply(func)

df.groupby(args1).col_name.expanding(args2).parallel_apply(func)

series.map(func)

series.parallel_map(func)

series.apply(func)

series.parallel_apply(func)

series.rolling(args).apply(func)

series.rolling(args).parallel_apply(func)

3.注意事項(xiàng)

1. 我有 8 個(gè) CPU,但 parallel_apply 只能加快大約4倍的計(jì)算速度。為什么?

答:正如我前面所言,Python中每個(gè)進(jìn)程占用一個(gè)核,Pandarallel 最多只能加快到你所擁有的核心的總數(shù),一個(gè) 4 核的超線程 CPU 將向操作系統(tǒng)顯示 8 個(gè) CPU,但實(shí)際上只有 4 個(gè)核心,因此最多加快4倍。

2. 并行化是有成本的(實(shí)例化新進(jìn)程,通過(guò)共享內(nèi)存發(fā)送數(shù)據(jù),...),所以只有當(dāng)并行化的計(jì)算量足夠大時(shí),并行化才是有意義的。對(duì)于很少量的數(shù)據(jù),使用 Pandarallel 并不總是值得的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多