Tầm quan trọng của việc vector hóa mã của bạn

Viết mã R hiệu quả

Colin Gillespie

Jumping Rivers & Newcastle University

Quy tắc chung

  • Gọi một hàm R cuối cùng sẽ chạy mã C hoặc FORTRAN
    • Phần mã này được tối ưu hóa rất mạnh

Mục tiêu

  • Truy cập càng nhanh càng tốt vào mã C hoặc FORTRAN bên dưới; càng ít lời gọi hàm càng tốt.
Viết mã R hiệu quả

Hàm vector hóa

  • Nhiều hàm R là vector hóa
    • Nhận một số đơn lẻ nhưng trả về một vector
rnorm(4)
-0.7247  0.2502  0.3510  0.6919
  • Vector làm đầu vào
mean(c(36, 48))
42
Viết mã R hiệu quả

Sinh số ngẫu nhiên

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

So sánh

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

với

x <- rnorm(n)
Viết mã R hiệu quả

Vì sao vòng lặp chậm?

Vòng lặp
x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)
Cấp phát
x <- vector("numeric", n)
  • Loop: Chi phí khởi tạo một lần
  • Vector hóa: Tương đương
Sinh dữ liệu
  • Loop: một triệu lần gọi rnorm()
  • Vector hóa: một lần gọi rnorm()
Gán giá trị
  • Loop: một triệu lần gọi phương thức gán
  • Vector hóa: một lần gán
Viết mã R hiệu quả

Câu lạc bộ R

Quy tắc thứ hai của câu lạc bộ R: hãy dùng lời giải vector hóa bất cứ khi nào có thể.

Viết mã R hiệu quả

Cùng luyện tập nào!

Viết mã R hiệu quả

Preparing Video For Download...