ความสำคัญของการ vectorize โค้ด

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

Colin Gillespie

Jumping Rivers & Newcastle University

หลักการทั่วไป

  • การเรียกฟังก์ชัน R ท้ายที่สุดจะไปถึงโค้ด C หรือ FORTRAN
    • โค้ดเหล่านั้นได้รับการ optimize อย่างเข้มข้น

เป้าหมาย

  • เข้าถึงโค้ด C หรือ FORTRAN โดยตรงให้เร็วที่สุด ยิ่งเรียกฟังก์ชันน้อยเท่าไรยิ่งดี
การเขียน R Code อย่างมีประสิทธิภาพ

ฟังก์ชันแบบ vectorized

  • ฟังก์ชัน R หลายตัวเป็น vectorized
    • รับตัวเลขเดียวแต่คืนค่าเป็น vector
rnorm(4)
-0.7247  0.2502  0.3510  0.6919
  • รับ vector เป็น input
mean(c(36, 48))
42
การเขียน R Code อย่างมีประสิทธิภาพ

การสร้างตัวเลขสุ่ม

library(microbenchmark)
n <- 1e6
x <- vector("numeric", n)
microbenchmark(
    x <- rnorm(n),
    {
        for(i in seq_along(x))
            x[i] <- rnorm(1)
        },
    times = 10
)
# Unit: milliseconds
# expr        lq mean    uq  cld
# rnorm(n)    60   70    80  a
# Looping   2600 2700  2800   b

## Output trimmed for presentation

เปรียบเทียบ

x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)

กับ

x <- rnorm(n)
การเขียน R Code อย่างมีประสิทธิภาพ

ทำไมลูปถึงช้า?

การวนลูป
x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)
การจัดสรรหน่วยความจำ
x <- vector("numeric", n)
  • ลูป: ต้นทุนครั้งเดียว
  • Vectorized: ใกล้เคียงกัน
การสร้างค่า
  • ลูป: เรียก rnorm() หนึ่งล้านครั้ง
  • Vectorized: เรียก rnorm() เพียงครั้งเดียว
การกำหนดค่า
  • ลูป: เรียก assignment method หนึ่งล้านครั้ง
  • Vectorized: กำหนดค่าเพียงครั้งเดียว
การเขียน R Code อย่างมีประสิทธิภาพ

R club

กฎข้อที่สองของ R club: ใช้แนวทาง vectorized ทุกครั้งที่ทำได้

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

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

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

Preparing Video For Download...