日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Pandas中Apply函數(shù)加速百倍的技巧

[ 引言 ] 雖然目前dask,cudf等包的出現(xiàn),使得我們的數(shù)據(jù)處理大大得到了加速,但是并不是每個(gè)人都有比較好的gpu,非常多的朋友仍然還在使用pandas工具包,但有時(shí)候真的很無(wú)奈。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括廣漢網(wǎng)站建設(shè)、廣漢網(wǎng)站制作、廣漢網(wǎng)頁(yè)制作以及廣漢網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,廣漢網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到廣漢省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

實(shí)驗(yàn)對(duì)比

1. Apply(Baseline)

我們以Apply為例,原始的Apply函數(shù)處理下面這個(gè)問(wèn)題,需要18.4s的時(shí)間。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 11, size=(1000000, 5)), columns=('a','b','c','d','e'))
def func(a,b,c,d,e):
if e == 10:
return c*d
elif (e < 10) and (e>=5):
return c+d
elif e < 5:
return a+b
%%time
df['new'] = df.apply(lambda x: func(x['a'], x['b'], x['c'], x['d'], x['e']), axis=1)
CPU times: user 17.9 s, sys: 301 ms, total: 18.2 s
Wall time: 18.4 s

2. Swift加速

因?yàn)樘幚硎遣⑿械?,所以我們可以使用Swift進(jìn)行加速,在使用Swift之后,相同的操作在我的機(jī)器上可以提升到7.67s。

%%time
# !pip install swifter
import swifter
df['new'] = df.swifter.apply(lambda x : func(x['a'],x['b'],x['c'],x['d'],x['e']),axis=1)
HBox(children=(HTML(value='Dask Apply'), FloatProgress(value=0.0, max=16.0), HTML(value='')))
CPU times: user 329 ms, sys: 240 ms, total: 569 ms
Wall time: 7.67 s

3. 向量化

使用Pandas和Numpy的最快方法是將函數(shù)向量化。如果我們的操作是可以直接向量化的話,那么我們就盡可能的避免使用:

  • for循環(huán);
  • 列表處理;
  • apply等操作

在將上面的問(wèn)題轉(zhuǎn)化為下面的處理之后,我們的時(shí)間縮短為:421 ms。

%%time
df['new'] = df['c'] * df['d'] #default case e = =10
mask = df['e'] < 10
df.loc[mask,'new'] = df['c'] + df['d']
mask = df['e'] < 5
df.loc[mask,'new'] = df['a'] + df['b']
CPU times: user 134 ms, sys: 149 ms, total: 283 ms
Wall time: 421 ms

4. 類(lèi)別轉(zhuǎn)化+向量化

我們先將上面的類(lèi)別轉(zhuǎn)化為int16型,再進(jìn)行相同的向量化操作,發(fā)現(xiàn)時(shí)間縮短為:116 ms。

for col in ('a','b','c','d'):
df[col] = df[col].astype(np.int16)
%%time
df['new'] = df['c'] * df['d'] #default case e = =10
mask = df['e'] < 10
df.loc[mask,'new'] = df['c'] + df['d']
mask = df['e'] < 5
df.loc[mask,'new'] = df['a'] + df['b']
CPU times: user 71.3 ms, sys: 42.5 ms, total: 114 ms
Wall time: 116 ms

5. 轉(zhuǎn)化為values處理

在能轉(zhuǎn)化為.values的地方盡可能轉(zhuǎn)化為.values,再進(jìn)行操作。

  • 此處先轉(zhuǎn)化為.values等價(jià)于轉(zhuǎn)化為numpy,這樣我們的向量化操作會(huì)更加快捷。

于是,上面的操作時(shí)間又被縮短為:74.9ms。

%%time
df['new'] = df['c'].values * df['d'].values #default case e = =10
mask = df['e'].values < 10
df.loc[mask,'new'] = df['c'] + df['d']
mask = df['e'].values < 5
df.loc[mask,'new'] = df['a'] + df['b']
CPU times: user 64.5 ms, sys: 12.5 ms, total: 77 ms
Wall time: 74.9 ms

實(shí)驗(yàn)匯總

通過(guò)上面的一些小的技巧,我們將簡(jiǎn)單的Apply函數(shù)加速了幾百倍,具體的:

  • Apply: 18.4 s
  • Apply + Swifter: 7.67 s
  • Pandas vectorizatoin: 421 ms
  • Pandas vectorization + data types: 116 ms
  • Pandas vectorization + values + data types: 74.9ms

網(wǎng)站名稱(chēng):Pandas中Apply函數(shù)加速百倍的技巧
網(wǎng)站鏈接:http://m.5511xx.com/article/dpdeedg.html