[問題] groupby 效能改進

看板Python作者 (123)時間6年前 (2018/03/25 19:02), 6年前編輯推噓2(2010)
留言12則, 4人參與, 6年前最新討論串1/1
想問要怎麼改進以下的 code , 讓速度變快 我以前是寫 R 的, 正將 code 轉換為 Python, 照理說 Python 應該要比較快 可是我不太熟悉 Python, 所以來請教版上的大大 我擷取一部分 data, 可以由這下載 : https://drive.google.com/open?id=1mneTEgrK22mKK7a4fquyMaW3pchIc-kh Python code #==================================================== import os,sys import pandas as pd import numpy as np import datetime os.chdir('/home/linsam/project/Kaggle/Grupo Bimbo Inventory Demand') data = pd.read_csv('train2.csv') #------------------------------------------ log_due = pd.DataFrame( np.log1p( data['Demanda_uni_equil'] ) ) log_due.columns = ['log_due'] data['log_due'] = log_due #----------------------------------------------- s = datetime.datetime.now() # 主要是這行 mean_due_age = data.groupby(['Agencia_ID'], as_index=False)['log_due'].agg({'mean_due_age':np.mean}) t = datetime.datetime.now() - s print( t ) # 0:00:00.719779 #========================================================= R code 如下 #========================================================= library(data.table) library(dplyr) setwd("/home/linsam/project/Kaggle/Grupo Bimbo Inventory Demand") data = fread("train2.csv") data$log.due = log1p( data$Demanda_uni_equil )#adj gc() #-------------------------------------------------------------------------------------------- s=Sys.time() mean.due.age = data[, .(mean.due.age = mean(log.due)), by = .(Agencia_ID)] t=Sys.time()-s t # Time difference of 0.1391425 secs #=================================================================== 雖然差距只有零點幾秒 但實際 data 大很多, 同樣的 code 我也會運行多次, 所以整體上差了大約 2 minute 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.204.62 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1521975733.A.129.html

03/25 19:42, 6年前 , 1F
03/25 19:42, 1F
感謝 ----------------------------------------------------- 在 groupby 之前先加入以下 code data[colname] = data[colname].astype('category') 速度上沒有改善多少耶 並沒有向上面那篇 100 loops, best of 3: 6.7 ms per loop 1 loop, best of 3: 2.37 s per loop 有如此大的差距,是因為它使用 .sum(),而我使用 agg 嗎? --------------------------------------------------------- 我發現是哪裡拖累速度了, 因為我對多個 col 做 groupby ( 5個col ) 所以即使 type 改成 category, 速度也沒有改善多少 --------------------------------------------------------- 自問自答 主要是 agg 在拖累速度, 來看看有沒有比較好的方法 ※ 編輯: f496328mm (118.160.204.62), 03/25/2018 21:53:42

03/25 22:09, 6年前 , 2F
https://goo.gl/Mv5nTX groupby字串的看起來還可以
03/25 22:09, 2F
感謝大大提供該連結 data.table vs dplyr vs pandas

03/25 22:10, 6年前 , 3F
Test 4
03/25 22:10, 3F

03/25 22:10, 6年前 , 4F
by int或是numeric 就滿悲劇的XDD
03/25 22:10, 4F

03/25 22:11, 6年前 , 5F
所以你說Python一定比較快 恩... 應該還是不一定
03/25 22:11, 5F

03/25 22:12, 6年前 , 6F
而且data.table的測試指出pandas記憶體用太多
03/25 22:12, 6F

03/25 22:13, 6年前 , 7F
在dplyr, data.table沒爆的情況下,pandas爆了
03/25 22:13, 7F

03/25 22:14, 6年前 , 8F
pandas記憶體效率比data.table差很多
03/25 22:14, 8F

03/25 22:14, 6年前 , 9F
Wes McKinney自己有說pandas是吃記憶體怪獸...
03/25 22:14, 9F

03/25 22:18, 6年前 , 10F
trace了一下issue,2E9列,pandas會爆掉那個已經fix
03/25 22:18, 10F
但是 Python 大多都用 pandas 吧? 記憶體效率差, 速度也並沒有比較快@@, 或許可以用 R train 完 model 後, save 給 Python 用 之前試過, R save model 之後, Python 可以直接用 ※ 編輯: f496328mm (118.160.204.62), 03/25/2018 22:31:23 ※ 編輯: f496328mm (118.160.204.62), 03/25/2018 22:32:49

03/26 00:42, 6年前 , 11F
Pandas on Ray 不知道這個有沒有幫助
03/26 00:42, 11F

03/26 12:25, 6年前 , 12F
pySpark 表示:
03/26 12:25, 12F
文章代碼(AID): #1Qju6r4f (Python)