โค้ดของฉันช้าเกินไป!

การเขียน R Code อย่างมีประสิทธิภาพ

Colin Gillespie

Jumping Rivers & Newcastle University

โค้ดช้าจริงหรือเปล่า?

  • 1 วินาที?
  • 1 นาที?
  • 1 ชั่วโมง?
การเขียน R Code อย่างมีประสิทธิภาพ

โค้ดช้าจริงหรือเปล่า?

การเขียน R Code อย่างมีประสิทธิภาพ

การ Benchmark

  1. สร้างฟังก์ชันครอบฟีเจอร์ที่ต้องการวัดประสิทธิภาพ
  2. จับเวลาฟังก์ชันในสถานการณ์ต่าง ๆ เช่น ชุดข้อมูล
การเขียน R Code อย่างมีประสิทธิภาพ

ตัวอย่าง: ลำดับตัวเลข

$$ 1, 2, 3, \ldots, n $$

Option 1
1:n
Option 2
seq(1, n)
Option 3
seq(1, n, by = 1)
การเขียน R Code อย่างมีประสิทธิภาพ

การห่อหุ้มด้วยฟังก์ชัน

colon <- function(n) 1:n
colon(5)
1 2 3 4 5
seq_default <- function(n) seq(1, n)
seq_by <- function(n) seq(1, n, by = 1)
การเขียน R Code อย่างมีประสิทธิภาพ

การจับเวลาด้วย system.time()

system.time(colon(1e8))
#   user  system elapsed
#  0.032   0.028   0.060
system.time(seq_default(1e8))
#   user  system elapsed
#  0.060   0.028   0.086
system.time(seq_by(1e8))
#   user  system elapsed
#  1.088   0.520   1.600
  • เวลา user คือเวลา CPU ที่ใช้สำหรับการรันคำสั่งของผู้ใช้
    • เวลา system คือเวลา CPU ที่ระบบใช้แทนกระบวนการที่เรียก
    • เวลา elapsed คือผลรวมโดยประมาณของ user และ system ซึ่งเป็นค่าที่เราสนใจมากที่สุด
การเขียน R Code อย่างมีประสิทธิภาพ

การเก็บผลลัพธ์

ปัญหาของ

system.time(colon(1e8))

คือยังไม่ได้เก็บผลลัพธ์ไว้ ต้องรันโค้ดใหม่เพื่อเก็บผลลัพธ์

res <- colon(1e8)

ตัวดำเนินการ <- ทำได้ทั้งสองอย่าง:

  • การส่งอาร์กิวเมนต์
  • การกำหนดค่าให้อ็อบเจกต์
system.time(res <- colon(1e8))

ตัวดำเนินการ = ทำได้เพียง หนึ่ง อย่าง:

  • การส่งอาร์กิวเมนต์
  • การกำหนดค่าให้อ็อบเจกต์
# Raises an error
system.time(res = colon(1e8))
การเขียน R Code อย่างมีประสิทธิภาพ

เวลาสัมพัทธ์

วิธีการ เวลาจริง (วินาที) เวลาสัมพัทธ์
colon(n) 0.060 $0.060/0.060 = 1.00$
seq_default(n) 0.086 $0.086/0.060 = 1.40$
seq_by(n) 1.607 $1.60/0.060 = 26.7$
การเขียน R Code อย่างมีประสิทธิภาพ

แพ็กเกจ Microbenchmark

  • เปรียบเทียบฟังก์ชันหลายตัว
    • แต่ละฟังก์ชันถูกรันหลายครั้ง
library("microbenchmark")

n <- 1e8 microbenchmark(colon(n), seq_default(n), seq_by(n), times = 10) # Run each function 10 times
# Unit: milliseconds
#           expr  min   lq  mean  median   uq  max neval cld
#       colon(n)   59  130   220     202  341  391    10  a
# seq_default(n)   94  204   290     337  348  383    10  a
#      seq_by(n) 1945 2044  2260    2275 2359 2787    10   b
การเขียน R Code อย่างมีประสิทธิภาพ

มาฝึกกันเถอะ!

การเขียน R Code อย่างมีประสิทธิภาพ

Preparing Video For Download...