Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rコードのベンチマーク

bob3bob3
October 20, 2022

 Rコードのベンチマーク

Rコードのベンチマーク手法

bob3bob3

October 20, 2022
Tweet

More Decks by bob3bob3

Other Decks in Technology

Transcript

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

    View full-size slide

  2. Rコードの実行時間を計る
    ● Rの中級者になり、コードのいろいろな書き方が身についてくると「どんな書
    き方をすると処理の効率がいいんだろう?」という疑問が湧いてくることが
    あります。

    ● 今回はRの実行時間を計る以下の三つの方法をお話しします。

    ○ base::system.time()

    ○ tictocパッケージ

    ○ microbenchmarkパッケージ


    View full-size slide

  3. 準備
    ● nycflights13のデータを使い、「月、
    飛行機会社、出発地、目的地毎に
    件数、飛行時間の平均値、中央
    値、標準偏差を算出する」処理を
    dplyr、dtplyr、data.tableで書き、そ
    れぞれの実行速度を計る。

    ● デモデータは約33万行。
    # ライブラリ
    library(tidyverse)
    library(dtplyr)
    library(data.table)
    library(nycflights13)
    # デモデータ
    dat <- flights |>
    left_join(planes, by = "tailnum")

    View full-size slide

  4. 準備:各処理の関数化
    # 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()
    }

    View full-size slide

  5. 準備:各処理の関数化
    # 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()
    }

    View full-size slide

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


    View full-size slide

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

    View full-size slide

  8. microbenchmarkパッケージ (1/3)
    ● 複数の処理を一度に測定できる。 

    ● 同じ処理を複数回試行して測定できる。 

    ● 結果を可視化できる。 

    library(microbenchmark)
    res_micro <- microbenchmark(
    "dplyr"= f_dplyr(),
    "dtplyr" = f_dtplyr(),
    "data.table" = f_data.table(),
    times = 30
    )

    View full-size slide

  9. microbenchmarkパッケージ (2/3)

    View full-size slide

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

    View full-size slide