自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Pandas中Apply函數(shù)加速百倍的技巧

開發(fā) 后端
pandas的許多問題我們都需要使用apply函數(shù)來進(jìn)行處理,而apply函數(shù)是非常慢的,本文我們就介紹如何加速apply函數(shù)600倍的技巧。

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

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

1. Apply(Baseline)

我們以Apply為例,原始的Apply函數(shù)處理下面這個(gè)問題,需要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等操作

在將上面的問題轉(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. 類別轉(zhuǎn)化+向量化

我們先將上面的類別轉(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)匯總

通過上面的一些小的技巧,我們將簡(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
責(zé)任編輯:龐桂玉 來源: 小詹學(xué)Python
相關(guān)推薦

2020-08-30 14:29:01

Pandas數(shù)據(jù)分析函數(shù)

2012-11-15 09:46:22

Xeon PhiIntel加速性能

2023-04-14 07:09:04

2023-02-22 14:47:24

模型AI

2012-11-21 17:35:21

Oracle技術(shù)嘉年華

2016-03-04 14:40:35

華為

2019-12-25 14:08:50

Pandas數(shù)據(jù)計(jì)算

2015-09-24 10:18:54

程序員身價(jià)

2015-03-12 10:21:05

阿里云宕機(jī)

2022-09-20 10:50:34

PandasNumPy

2024-11-26 15:00:00

語(yǔ)言模型AI

2014-11-11 15:57:07

2023-06-26 22:15:14

ChatGPT思維模型

2024-08-01 08:06:11

虛擬線程性能

2019-06-14 08:28:32

SQL數(shù)據(jù)庫(kù)語(yǔ)句

2021-12-29 10:26:58

芯片半導(dǎo)體技術(shù)

2019-06-17 10:23:18

戴爾

2018-12-10 11:00:01

MySQL數(shù)據(jù)庫(kù)索引

2023-05-31 07:24:48

2021-06-01 09:58:53

Windows 10EdgeChrono
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)