一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解Python中的Pandas和Numpy庫(kù)

數(shù)據(jù)分析與開(kāi)發(fā) ? 來(lái)源:算法進(jìn)階 ? 作者:泳魚(yú) ? 2022-05-25 12:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

pandas、numpy是Python數(shù)據(jù)科學(xué)中非常常用的庫(kù),numpy是Python的數(shù)值計(jì)算擴(kuò)展,專(zhuān)門(mén)用來(lái)處理矩陣,它的運(yùn)算效率比列表更高效。 pandas是基于numpy的數(shù)據(jù)處理工具,能更方便的操作大型表格類(lèi)型的數(shù)據(jù)集。但是,隨著數(shù)據(jù)量的劇增,有時(shí)numpy和pandas的速度就成瓶頸。如下我們會(huì)介紹一些優(yōu)化秘籍:里面包含了 代碼層面的優(yōu)化,以及可以無(wú)腦使用的性能優(yōu)化擴(kuò)展包。

1、NumExpr

NumExpr 是一個(gè)對(duì)NumPy計(jì)算式進(jìn)行的性能優(yōu)化。NumExpr的使用及其簡(jiǎn)單,只需要將原來(lái)的numpy語(yǔ)句使用雙引號(hào)框起來(lái),并使用numexpr中的evaluate方法調(diào)用即可。

經(jīng)驗(yàn)上看,數(shù)據(jù)有上萬(wàn)條+ 使用NumExpr才比較優(yōu)效果,對(duì)于簡(jiǎn)單運(yùn)算使用NumExpr可能會(huì)更慢。如下較復(fù)雜計(jì)算,速度差不多快了5倍。

importnumexprasne

importnumpyasnp

a=np.linspace(0,1000,1000)

print('#numpy十次冪計(jì)算')
%timeita**10

print('#numexpr十次冪計(jì)算')
%timeitne.evaluate('a**10')
7f5cc27c-d69d-11ec-bce3-dac502259ad0.png

2、Numba

Numba 使用行業(yè)標(biāo)準(zhǔn)的LLVM編譯器庫(kù)在運(yùn)行時(shí)將 Python 函數(shù)轉(zhuǎn)換為優(yōu)化的機(jī)器代碼。Python 中 Numba 編譯的數(shù)值算法可以接近 C 或 FORTRAN 的速度。

如果在你的數(shù)據(jù)處理過(guò)程涉及到了大量的數(shù)值計(jì)算,那么使用numba可以大大加快代碼的運(yùn)行效率(一般來(lái)說(shuō),Numba 引擎在處理大量數(shù)據(jù)點(diǎn) 如 1 百萬(wàn)+ 時(shí)表現(xiàn)出色)。numba使用起來(lái)也很簡(jiǎn)單,因?yàn)閚umba內(nèi)置的函數(shù)本身是個(gè)裝飾器,所以只要在自己定義好的函數(shù)前面加個(gè)@nb.方法就行,簡(jiǎn)單快捷!
#pipinstallnumba

importnumbaasnb

#用numba加速的求和函數(shù)
@nb.jit()
defnb_sum(a):
Sum=0
foriinrange(len(a)):
Sum+=a[i]
returnSum

#沒(méi)用numba加速的求和函數(shù)
defpy_sum(a):
Sum=0
foriinrange(len(a)):
Sum+=a[i]
returnSum

importnumpyasnp
a=np.linspace(0,1000,1000)#創(chuàng)建一個(gè)長(zhǎng)度為1000的數(shù)組
print('#python求和函數(shù)')
%timeitsum(a)
print('#沒(méi)加速的for循環(huán)求和函數(shù)')
%timeitpy_sum(a)
print('#numba加速的for循環(huán)求和函數(shù)')
%timeitnb_sum(a)
print('#numpy求和函數(shù)')
%timeitnp.sum(a)

7fdd3272-d69d-11ec-bce3-dac502259ad0.png

當(dāng)前示例可以看出,numba甚至比號(hào)稱(chēng)最接近C語(yǔ)言速度運(yùn)行的numpy還要快5倍+,對(duì)于python求和速度快了幾百倍。。此外,Numba還支持GPU加速、矢量化加速方法,可以進(jìn)一步達(dá)到更高的性能。
fromnumbaimportcuda
cuda.select_device(1)

@cuda.jit
defCudaSquare(x):
i,j=cuda.grid(2)
x[i][j]*=x[i][j]


#numba的矢量化加速
frommathimportsin
@nb.vectorize()
defnb_vec_sin(a):
returnsin(a)

3、CuPy

CuPy 是一個(gè)借助 CUDA GPU 庫(kù)在英偉達(dá) GPU 上實(shí)現(xiàn) Numpy 數(shù)組的庫(kù)?;?Numpy 數(shù)組的實(shí)現(xiàn),GPU 自身具有的多個(gè) CUDA 核心可以促成更好的并行加速。

#pipinstallcupy
importnumpyasnp
importcupyascp
importtime

###numpy
s=time.time()
x_cpu=np.ones((1000,1000,1000))
e=time.time()
print(e-s)

###CuPy
s=time.time()
x_gpu=cp.ones((1000,1000,1000))
e=time.time()
print(e-s)
上述代碼,Numpy 創(chuàng)建(1000, 1000, 1000)的數(shù)組用了 1.68 秒,而 CuPy 僅用了 0.16 秒,實(shí)現(xiàn)了 10.5 倍的加速。隨著數(shù)據(jù)量的猛增,CuPy的性能提升會(huì)更為明顯。

4、pandas使用技巧

更多pandas性能提升技巧請(qǐng)戳官方文檔:https://pandas.pydata.org/pandas-docs/stable/user_guide/enhancingperf.html

4.1 按行迭代優(yōu)化

我們按行對(duì)dataframe進(jìn)行迭代,一般我們會(huì)用iterrows這個(gè)函數(shù)。在新版的pandas中,提供了一個(gè)更快的itertuples函數(shù),如下可以看到速度快了幾十倍。

importpandasaspd
importnumpyasnp
importtime
df=pd.DataFrame({'a':np.random.randn(100000),
'b':np.random.randn(100000),
'N':np.random.randint(100,1000,(100000)),
'x':np.random.randint(1,10,(100000))})

%%timeit
a2=[]
forrowindf.itertuples():
temp=getattr(row,'a')
a2.append(temp*temp)
df['a2']=a2
%%timeit
a2=[]
forindex,rowindf.iterrows():
temp=row['a']
a2.append(temp*temp)
df['a2']=a2


80296156-d69d-11ec-bce3-dac502259ad0.png

4.2 apply、applymap優(yōu)化

當(dāng)對(duì)于每行執(zhí)行類(lèi)似的操作時(shí),用循環(huán)逐行處理效率很低。這時(shí)可以用apply或applymap搭配函數(shù)操作,其中apply是可用于逐行計(jì)算,而applymap可以做更細(xì)粒度的逐個(gè)元素的計(jì)算。

#列a、列b逐行進(jìn)行某一函數(shù)計(jì)算
df['a3']=df.apply(lambdarow:row['a']*row['b'],axis=1)
#逐個(gè)元素保留兩位小數(shù)
df.applymap(lambdax:"%.2f"%x)
8040ae24-d69d-11ec-bce3-dac502259ad0.png

4.3 聚合函數(shù)agg優(yōu)化

對(duì)于某列將進(jìn)行聚合后,使用內(nèi)置的函數(shù)比自定義函數(shù)效率更高,如下示例速度加速3倍

%timeitdf.groupby("x")['a'].agg(lambdax:x.sum())

%timeitdf.groupby("x")['a'].agg(sum)

%timeitdf.groupby("x")['a'].agg(np.sum)
808b3192-d69d-11ec-bce3-dac502259ad0.png

4.4 文件操作

pandas讀取文件,pkl格式的數(shù)據(jù)的讀取速度最快,其次是hdf格式的數(shù)據(jù),再者是讀取csv格式數(shù)據(jù),而xlsx的讀取是比較慢的。但是存取csv有個(gè)好處是,這個(gè)數(shù)據(jù)格式通用性更好,占用內(nèi)存硬盤(pán)資源也比較少。此外,對(duì)于大文件,csv還可以對(duì)文件分塊、選定某幾列、指定數(shù)據(jù)類(lèi)型做讀取。

80dab5d2-d69d-11ec-bce3-dac502259ad0.png

4.5 pandas.eval

pandas.eval 是基于第一節(jié)提到的numexpr,pandas也是基于numpy開(kāi)發(fā)的,numexpr同樣可以被用來(lái)對(duì)pandas加速)。使用eval表達(dá)式的一個(gè)經(jīng)驗(yàn)是數(shù)據(jù)超過(guò) 10,000 行的情況下使用會(huì)有明顯優(yōu)化效果。
importpandasaspd
nrows,ncols=20000,100
df1,df2,df3,df4=[pd.DataFrame(np.random.randn(nrows,ncols))for_inrange(4)]

print('pd')
%timeitdf1+df2+df3+df4
print('pd.eval')
%timeitpd.eval("df1+df2+df3+df4")
8107c784-d69d-11ec-bce3-dac502259ad0.png

5、Cython優(yōu)化

Cython是一個(gè)基于C語(yǔ)言的Python 編譯器,在一些計(jì)算量大的程序中,可以Cython來(lái)實(shí)現(xiàn)相當(dāng)大的加速??紤]大部分人可能都不太了解復(fù)雜的cython語(yǔ)句,下面介紹下Cython的簡(jiǎn)易版使用技巧。

通過(guò)在Ipython加入 Cython 魔術(shù)函數(shù)%load_ext Cython,如下示例就可以加速了一倍。進(jìn)一步再借助更高級(jí)的cython語(yǔ)句,還是可以比Python快個(gè)幾十上百倍。

%%cython
deff_plain(x):
returnx*(x-1)
defintegrate_f_plain(a,b,N):
s=0
dx=(b-a)/N
foriinrange(N):
s+=f_plain(a+i*dx)
returns*dx
811fcdac-d69d-11ec-bce3-dac502259ad0.png

6、swifter

swifter是pandas的插件,可以直接在pandas的數(shù)據(jù)上操作。Swifter的優(yōu)化方法檢驗(yàn)計(jì)算是否可以矢量化或者并行化處理,以提高性能。如常見(jiàn)的apply就可以通過(guò)swifter并行處理。

importpandasaspd
importswifter

df.swifter.apply(lambdax:x.sum()-x.min())

7、Modin

Modin后端使用dask或者ray(dask是類(lèi)似pandas庫(kù)的功能,可以實(shí)現(xiàn)并行讀取運(yùn)行),是個(gè)支持分布式運(yùn)行的類(lèi)pandas庫(kù),簡(jiǎn)單通過(guò)更改一行代碼import modin.pandas as pd就可以?xún)?yōu)化 pandas,常用的內(nèi)置的read_csv、concat、apply都有不錯(cuò)的加速。注:并行處理的開(kāi)銷(xiāo)會(huì)使小數(shù)據(jù)集的處理速度變慢。

818efa88-d69d-11ec-bce3-dac502259ad0.png

!pipinstallmodin
importpandas
importmodin.pandasaspd
importtime

##pandas

pandas_df=pandas.DataFrame({'a':np.random.randn(10000000),
'b':np.random.randn(10000000),
'N':np.random.randint(100,10000,(10000000)),
'x':np.random.randint(1,1000,(10000000))})



start=time.time()

big_pandas_df=pandas.concat([pandas_dffor_inrange(25)])

end=time.time()
pandas_duration=end-start
print("Timetoconcatwithpandas:{}seconds".format(round(pandas_duration,3)))

####modin.pandas
modin_df=pd.DataFrame({'a':np.random.randn(10000000),
'b':np.random.randn(10000000),
'N':np.random.randint(100,10000,(10000000)),
'x':np.random.randint(1,1000,(10000000))})

start=time.time()
big_modin_df=pd.concat([modin_dffor_inrange(25)])

end=time.time()
modin_duration=end-start
print("TimetoconcatwithModin:{}seconds".format(round(modin_duration,3)))

print("Modinis{}xfasterthanpandasat`concat`!".format(round(pandas_duration/modin_duration,2)))

81bc89b2-d69d-11ec-bce3-dac502259ad0.png

原文標(biāo)題:Pandas、Numpy 性能優(yōu)化秘籍

文章出處:【微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)處理
    +關(guān)注

    關(guān)注

    0

    文章

    627

    瀏覽量

    29159
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86666
  • 性能優(yōu)化
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    7528

原文標(biāo)題:Pandas、Numpy 性能優(yōu)化秘籍

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    達(dá)夢(mèng)數(shù)據(jù)庫(kù)常用管理SQL命令詳解

    達(dá)夢(mèng)數(shù)據(jù)庫(kù)常用管理SQL命令詳解
    的頭像 發(fā)表于 06-17 15:12 ?463次閱讀
    達(dá)夢(mèng)數(shù)據(jù)<b class='flag-5'>庫(kù)</b>常用管理SQL命令<b class='flag-5'>詳解</b>

    python入門(mén)圣經(jīng)-高清電子書(shū)(建議下載)

    此資料內(nèi)容是一本針對(duì)所有層次的Python 讀者而作的Python 入門(mén)電子書(shū)。 全書(shū)分兩部分:第一部分介紹用Python 編程所必須了解的基本概念,包括matplotlib、NumPy
    發(fā)表于 04-10 16:53

    Python在嵌入式系統(tǒng)的應(yīng)用場(chǎng)景

    你想把你的職業(yè)生涯提升到一個(gè)新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開(kāi)發(fā)更多地依賴(lài)于C和C++語(yǔ)言,Python的優(yōu)勢(shì)在于其簡(jiǎn)潔的語(yǔ)法、豐富的庫(kù)和快速的開(kāi)發(fā)周期,這使得它在某些嵌入式場(chǎng)景
    的頭像 發(fā)表于 03-19 14:10 ?695次閱讀

    深度學(xué)習(xí)入門(mén):簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)的構(gòu)建與實(shí)現(xiàn)

    深度學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)是核心模型。今天我們用 PythonNumPy 構(gòu)建一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)。 神經(jīng)網(wǎng)絡(luò)由多個(gè)神經(jīng)元組成,神經(jīng)元之間通過(guò)權(quán)重連接。我們構(gòu)建一個(gè)包含輸入層、隱藏層和輸出層的簡(jiǎn)單
    的頭像 發(fā)表于 01-23 13:52 ?520次閱讀

    使用Python實(shí)現(xiàn)xgboost教程

    裝: bash復(fù)制代碼conda install -c conda-forge xgboost 2. 導(dǎo)入必要的庫(kù) 在你的Python腳本或Jupyter Notebook,導(dǎo)入必要的庫(kù)
    的頭像 發(fā)表于 01-19 11:21 ?1352次閱讀

    適用于MySQL和MariaDB的Python連接器:可靠的MySQL數(shù)據(jù)連接器和數(shù)據(jù)庫(kù)

    和 MariaDB 數(shù)據(jù)庫(kù)服務(wù)器以及托管數(shù)據(jù)庫(kù)服務(wù),以對(duì)存儲(chǔ)的數(shù)據(jù)執(zhí)行創(chuàng)建、讀取、更新和刪除操作。該解決方案完全實(shí)現(xiàn)了 Python DB API 2.0 規(guī)范,并作為 Windows、macOS
    的頭像 發(fā)表于 01-17 12:18 ?485次閱讀
    適用于MySQL和MariaDB的<b class='flag-5'>Python</b>連接器:可靠的MySQL數(shù)據(jù)連接器和數(shù)據(jù)<b class='flag-5'>庫(kù)</b>

    適用于Oracle的Python連接器:可訪問(wèn)托管以及非托管的數(shù)據(jù)庫(kù)

    適用于 Oracle 的 Python 連接器 適用于 Oracle 的 Python 連接器是一種可靠的連接解決方案,用于從 Python 應(yīng)用程序訪問(wèn) Oracle 數(shù)據(jù)庫(kù)服務(wù)器和
    的頭像 發(fā)表于 01-14 10:30 ?461次閱讀

    使用Python進(jìn)行串口通信的案例

    當(dāng)然!以下是一個(gè)使用Python進(jìn)行串口通信的簡(jiǎn)單示例。這個(gè)示例展示了如何配置串口、發(fā)送數(shù)據(jù)以及接收數(shù)據(jù)。我們將使用 pyserial 庫(kù),這是一個(gè)非常流行的用于串口通信的Python庫(kù)
    的頭像 發(fā)表于 11-22 09:11 ?1439次閱讀

    如何使用Python構(gòu)建LSTM神經(jīng)網(wǎng)絡(luò)模型

    構(gòu)建一個(gè)LSTM(長(zhǎng)短期記憶)神經(jīng)網(wǎng)絡(luò)模型是一個(gè)涉及多個(gè)步驟的過(guò)程。以下是使用Python和Keras庫(kù)構(gòu)建LSTM模型的指南。 1. 安裝必要的庫(kù) 首先,確保你已經(jīng)安裝了Python
    的頭像 發(fā)表于 11-13 10:10 ?1558次閱讀

    Python庫(kù)解析:通過(guò)庫(kù)實(shí)現(xiàn)代理請(qǐng)求與數(shù)據(jù)抓取

    Python,有多個(gè)庫(kù)可以幫助你實(shí)現(xiàn)代理請(qǐng)求和數(shù)據(jù)抓取。這些庫(kù)提供了豐富的功能和靈活的API,使得你可以輕松地發(fā)送HTTP請(qǐng)求、處理響應(yīng)、解析HTML/XML/JSON數(shù)據(jù),以及進(jìn)
    的頭像 發(fā)表于 10-24 07:54 ?482次閱讀

    pytorch和python的關(guān)系是什么

    在當(dāng)今的人工智能領(lǐng)域,Python已經(jīng)成為了最受歡迎的編程語(yǔ)言之一。Python的易學(xué)易用、豐富的庫(kù)和框架以及強(qiáng)大的社區(qū)支持,使其成為了數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)和深度學(xué)習(xí)等領(lǐng)域的首選語(yǔ)言。而在深度學(xué)習(xí)領(lǐng)域
    的頭像 發(fā)表于 08-01 15:27 ?3265次閱讀

    Python建模算法與應(yīng)用

    上成為理想的腳本語(yǔ)言,特別適用于快速的應(yīng)用程序開(kāi)發(fā)。本文將詳細(xì)介紹Python在建模算法的應(yīng)用,包括常見(jiàn)的建模算法、Python在建模的優(yōu)勢(shì)、常用
    的頭像 發(fā)表于 07-24 10:41 ?1241次閱讀

    Python在AI的應(yīng)用實(shí)例

    Python在人工智能(AI)領(lǐng)域的應(yīng)用極為廣泛且深入,從基礎(chǔ)的數(shù)據(jù)處理、模型訓(xùn)練到高級(jí)的應(yīng)用部署,Python都扮演著至關(guān)重要的角色。以下將詳細(xì)探討Python在AI的幾個(gè)關(guān)鍵應(yīng)用
    的頭像 發(fā)表于 07-19 17:16 ?2656次閱讀

    opencv-python和opencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)軟件庫(kù),它提供了大量的圖像和視頻處理功能。OpenCV-Python
    的頭像 發(fā)表于 07-16 10:38 ?2071次閱讀

    Python的人工智能框架與實(shí)例

    在人工智能(AI)領(lǐng)域,Python因其簡(jiǎn)潔的語(yǔ)法、豐富的庫(kù)和強(qiáng)大的社區(qū)支持,成為了最受歡迎的編程語(yǔ)言之一。本文將詳細(xì)介紹Python的人工智能框架,并通過(guò)具體實(shí)例展示如何使用這些框
    的頭像 發(fā)表于 07-15 14:54 ?2622次閱讀