Slide 1

Slide 1 text

Rコードのベンチマーク Tokyo.R #102 2022/10/22 LT @bob3bob3

Slide 2

Slide 2 text

Rコードの実行時間を計る ● Rの中級者になり、コードのいろいろな書き方が身についてくると「どんな書 き方をすると処理の効率がいいんだろう?」という疑問が湧いてくることが あります。
 ● 今回はRの実行時間を計る以下の三つの方法をお話しします。
 ○ base::system.time()
 ○ tictocパッケージ
 ○ microbenchmarkパッケージ


Slide 3

Slide 3 text

準備 ● nycflights13のデータを使い、「月、 飛行機会社、出発地、目的地毎に 件数、飛行時間の平均値、中央 値、標準偏差を算出する」処理を dplyr、dtplyr、data.tableで書き、そ れぞれの実行速度を計る。
 ● デモデータは約33万行。 # ライブラリ library(tidyverse) library(dtplyr) library(data.table) library(nycflights13) # デモデータ dat <- flights |> left_join(planes, by = "tailnum")

Slide 4

Slide 4 text

準備:各処理の関数化 # dplyrでの処理を関数化 f_dplyr <- function(){ dat |> group_by(month, carrier, origin, dest) |> summarise( 件数 = n(), 平均 = mean(air_time, na.rm = TRUE), 中央値 = median(air_time, na.rm = TRUE), .groups = "drop" ) } # dtplyrでの処理を関数化 f_dtplyr <- function(){ dat |> lazy_dt() |> group_by(month, carrier, origin, dest) |> summarise( 件数 = n(), 平均 = mean(air_time, na.rm = TRUE), 中央値 = median(air_time, na.rm = TRUE), .groups = "drop" ) |> as_tibble() }

Slide 5

Slide 5 text

準備:各処理の関数化 # data.tableでの処理を関数化 f_data.table <- function(){ dt <- dat |> data.table( key=c("month", "carrier", "origin", "dest") ) dt[ , .( 件数 = .N, 平均 = air_time |> mean(na.rm = TRUE), 中央値 = air_time |> median(na.rm = TRUE) ), by = list(month, carrier, origin, dest) ] |> as_tibble() }

Slide 6

Slide 6 text

base::system.time() system.time()の第一引数に測定したい 処理を入れるだけ。


Slide 7

Slide 7 text

tictocパッケージ # tic()とtoc()で測定したい処理を挟む library(tictoc) tic() f_dplyr() toc() tic() f_dtplyr() toc() tic() f_data.table() toc()

Slide 8

Slide 8 text

microbenchmarkパッケージ (1/3) ● 複数の処理を一度に測定できる。 
 ● 同じ処理を複数回試行して測定できる。 
 ● 結果を可視化できる。 
 library(microbenchmark) res_micro <- microbenchmark( "dplyr"= f_dplyr(), "dtplyr" = f_dtplyr(), "data.table" = f_data.table(), times = 30 )

Slide 9

Slide 9 text

microbenchmarkパッケージ (2/3)

Slide 10

Slide 10 text

microbenchmarkパッケージ (3/3) # 測定結果の可視化 res_micro |> autoplot() # 素のdata.tableよりdtplyrの方が速いのは # どこか書き方が悪いのだろうか?

Slide 11

Slide 11 text

Enjoy!