优化自定义函数_Pandas常见的性能优化方法
文章來(lái)源于Datawhale ,作者阿水
Pandas是數(shù)據(jù)科學(xué)和數(shù)據(jù)競(jìng)賽中常見(jiàn)的庫(kù),我們使用Pandas可以進(jìn)行快速讀取數(shù)據(jù)、分析數(shù)據(jù)、構(gòu)造特征。但Pandas在使用上有一些技巧和需要注意的地方,如果你沒(méi)有合適的使用,那么Pandas可能運(yùn)行速度非常慢。本文將整理一些Pandas使用技巧,主要是用來(lái)節(jié)約內(nèi)存和提高代碼速度。
1 數(shù)據(jù)讀取與存取
在Pandas中內(nèi)置了眾多的數(shù)據(jù)讀取函數(shù),可以讀取眾多的數(shù)據(jù)格式,最常見(jiàn)的就是read_csv函數(shù)從csv文件讀取數(shù)據(jù)了。但read_csv在讀取大文件時(shí)并不快,所以建議你使用read_csv讀取一次原始文件,將dataframe存儲(chǔ)為HDF或者feather格式。一般情況下HDF的讀取比讀取csv文件快幾十倍,但HDF文件在大小上會(huì)稍微大一些。
建議1:盡可能的避免讀取原始csv,使用hdf、feather或h5py格式文件加快文件讀取;
在某些定長(zhǎng)的字符數(shù)據(jù)的讀取情況下,read_csv讀取速度比codecs.readlines慢很多倍。同時(shí)如果你想要表格盡量占用較小的內(nèi)存,可以在read_csv時(shí)就設(shè)置好每類(lèi)的類(lèi)型。
2 itertuples與iterrows
itertuples和iterrows都能實(shí)現(xiàn)按行進(jìn)行迭代的操作,但在任何情況下itertuples都比iterrows快很多倍。
建議2:如果必須要要用iterrows,可以用itertuples來(lái)進(jìn)行替換。
3 apply、transform和agg時(shí)盡量使用內(nèi)置函數(shù)
在很多情況下會(huì)遇到groupby之后做一些統(tǒng)計(jì)值計(jì)算,而如果用內(nèi)置函數(shù)的寫(xiě)法會(huì)快很多。
transform() 方法+自定義函數(shù),用時(shí)1分57s
transform() 方法+內(nèi)置方法,用時(shí)712ms
agg() 方法+自定義函數(shù),用時(shí)1分2s
agg() 方法+內(nèi)置方法,用時(shí)694ms
建議3:在grouby、agg和transform時(shí)盡量使用內(nèi)置函數(shù)計(jì)算。
這一部分的統(tǒng)計(jì)數(shù)據(jù)來(lái)自:https://www.cnblogs.com/wkang/p/9794678.html
4 第三方庫(kù)并行庫(kù)
由于Pandas的一些操作都是單核的,往往浪費(fèi)其他核的計(jì)算時(shí)間,因此有一些第三方庫(kù)對(duì)此進(jìn)行了改進(jìn):
- modin:對(duì)讀取和常見(jiàn)的操作進(jìn)行并行;
- swifter:對(duì)apply函數(shù)進(jìn)行并行操作;
當(dāng)然我之前也對(duì)此類(lèi)庫(kù)進(jìn)行了嘗試,在一些情況下會(huì)快一些,但還是不太穩(wěn)定。在阿里云安全賽中我是用joblib庫(kù)寫(xiě)的并行特征提取,比單核特征提取快60倍。
建議4:如果能并行就并行,用第三方庫(kù)或者自己手寫(xiě)多核計(jì)算。
5 代碼優(yōu)化思路
在優(yōu)化Pandas時(shí)可以參考如下操作的時(shí)間對(duì)比:
建議5:在優(yōu)化的過(guò)程中可以按照自己需求進(jìn)行優(yōu)化代碼,寫(xiě)代碼盡量避免循環(huán),盡量寫(xiě)能夠向量化計(jì)算的代碼,盡量寫(xiě)多核計(jì)算的代碼。
Pandas官方也寫(xiě)了一篇性能優(yōu)化的文章,非常值得閱讀:
https://pandas.pydata.org/pandas-docs/stable/user_guide/enhancingperf.html
最后,我自己是一名從事了多年開(kāi)發(fā)的Python老程序員,辭職目前在做自己的Python私人定制課程,今年年初我花了一個(gè)月整理了一份最適合2019年學(xué)習(xí)的Python學(xué)習(xí)干貨,可以送給每一位喜歡Python的小伙伴,想要獲取的可以關(guān)注我的頭條號(hào)并在后臺(tái)私信我:01,即可免費(fèi)獲取。
總結(jié)
以上是生活随笔為你收集整理的优化自定义函数_Pandas常见的性能优化方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 百度云盘照片导入华为相册里_必须知道的相
- 下一篇: 设计师推出 iPhone 十六周年纪念壁