欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python提高運(yùn)行速度工具之Pandarallel的使用教程

 更新時(shí)間:2022年09月27日 11:37:12   作者:我愛Python數(shù)據(jù)挖掘  
為了提高運(yùn)行速度,我們一般會(huì)采用多進(jìn)程的方式。而常見的方案對(duì)于普通python玩家來說都不是特別友好,怎樣才能算作一個(gè)友好的并行處理方案?本文就來和大家講講pandarallel的使用

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

  • multiprocessing
  • concurrent.futures.ProcessPoolExecutor()
  • joblib
  • ppserver
  • celery

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

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

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

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

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

1.準(zhǔn)備

開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上

pip install pandarallel

2.使用 Pandarallel

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

from pandarallel import pandarallel
pandarallel.initialize()

這樣才能調(diào)用并行計(jì)算的API,不過 initialize 中有一個(gè)重要參數(shù)需要說明,那就是 nb_workers ,它將指定并行計(jì)算的Worker數(shù),如果沒有設(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ù)的例子了:

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)程,通過共享內(nèi)存發(fā)送數(shù)據(jù),…),所以只有當(dāng)并行化的計(jì)算量足夠大時(shí),并行化才是有意義的。對(duì)于很少量的數(shù)據(jù),使用 Pandarallel 并不總是值得的。

到此這篇關(guān)于Python提高運(yùn)行速度工具之Pandarallel的使用教程的文章就介紹到這了,更多相關(guān)Python Pandarallel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中from module import * 的一個(gè)坑

    python中from module import * 的一個(gè)坑

    from module import *把module中的成員全部導(dǎo)到了當(dāng)前的global namespace,訪問起來就比較方便了。當(dāng)然,python style一般不建議這么做,因?yàn)榭赡芤餹ame conflict。
    2014-07-07
  • python中自帶的三個(gè)裝飾器的實(shí)現(xiàn)

    python中自帶的三個(gè)裝飾器的實(shí)現(xiàn)

    這篇文章主要介紹了python中自帶的三個(gè)裝飾器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • M1芯片安裝python3.9.1的實(shí)現(xiàn)

    M1芯片安裝python3.9.1的實(shí)現(xiàn)

    這篇文章主要介紹了M1芯片安裝python3.9.1的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python與Node.js之間實(shí)現(xiàn)通信的JSON數(shù)據(jù)接收發(fā)送

    Python與Node.js之間實(shí)現(xiàn)通信的JSON數(shù)據(jù)接收發(fā)送

    Python和Node.js是兩個(gè)流行且功能強(qiáng)大的編程語言,它們之間使用JSON格式進(jìn)行數(shù)據(jù)交換是一種高效和靈活的方式,本文將詳細(xì)介紹如何在Python和Node.js之間通過JSON進(jìn)行數(shù)據(jù)通信,包括發(fā)送和接收J(rèn)SON數(shù)據(jù)以及一些常見的交互示例代碼
    2024-01-01
  • mac安裝pytorch及系統(tǒng)的numpy更新方法

    mac安裝pytorch及系統(tǒng)的numpy更新方法

    今天小編就為大家分享一篇mac安裝pytorch及系統(tǒng)的numpy更新方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python生成器next方法和send方法區(qū)別詳解

    Python生成器next方法和send方法區(qū)別詳解

    這篇文章主要介紹了Python生成器next方法和send方法區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Pytorch訓(xùn)練模型得到輸出后計(jì)算F1-Score 和AUC的操作

    Pytorch訓(xùn)練模型得到輸出后計(jì)算F1-Score 和AUC的操作

    這篇文章主要介紹了Pytorch訓(xùn)練模型得到輸出后計(jì)算F1-Score 和AUC的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python使用Matplotlib畫餅圖

    python使用Matplotlib畫餅圖

    這篇文章主要介紹了python使用Matplotlib畫餅圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Python3獲取拉勾網(wǎng)招聘信息的方法實(shí)例

    Python3獲取拉勾網(wǎng)招聘信息的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Python3獲取拉勾網(wǎng)招聘信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python3具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 在Python中f-string的幾個(gè)技巧,你都知道嗎

    在Python中f-string的幾個(gè)技巧,你都知道嗎

    f-string想必很多Python用戶都基礎(chǔ)性的使用過,但是百分之九十的人不知道?在Python中f-string的幾個(gè)技巧,今天就帶大家一起看看Python f-string技巧大全,需要的朋友參考下吧
    2021-10-10

最新評(píng)論