Vektorisasi untuk Kecepatan
Ganti perulangan eksplisit dengan operasi tervectorisasi untuk peningkatan kecepatan yang signifikan.
Vektorisasi untuk Kecepatan adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.
Mengapa Vektorisasi Penting
R adalah bahasa yang ditafsirkan, sehingga perulangan for memiliki overhead pada setiap iterasi — pengiriman pemanggilan fungsi, pemeriksaan batas, dan koersi tipe. Operasi tervectorisasi memindahkan pekerjaan tersebut ke kode C terkompilasi yang berjalan jauh lebih cepat.
Vektorisasi adalah pengoptimalan paling berdampak yang tersedia dalam R dasar.
Contoh Perulangan vs cumsum()
Menghitung total berjalan dengan perulangan for dibandingkan dengan cumsum() bawaan menunjukkan perbedaannya dengan jelas. cumsum() memanggil kode terkompilasi tingkat C dan memproses seluruh vektor dalam satu lintasan.
n <- 500000
x <- rnorm(n)
t_loop <- system.time({
result <- numeric(n)
result[1] <- x[1]
for (i in 2:n) result[i] <- result[i-1] + x[i]
})['elapsed']
t_vec <- system.time({
result2 <- cumsum(x)
})['elapsed']
cat('Loop :', t_loop, 's
')
cat('cumsum:', t_vec, 's
')ifelse() vs for + if
ifelse(condition, yes, no) adalah kondisi tervectorisasi yang mengevaluasi kondisi di seluruh vektor sekaligus. Fungsi ini menggantikan perulangan for + if elemen demi elemen dengan satu lintasan tingkat C.
n <- 300000
x <- rnorm(n)
t_loop <- system.time({
result <- numeric(n)
for (i in seq_len(n)) result[i] <- if (x[i] > 0) x[i] else -x[i]
})['elapsed']
t_vec <- system.time({
result2 <- ifelse(x > 0, x, -x)
})['elapsed']
cat('for+if :', t_loop, 's
')
cat('ifelse :', t_vec, 's
')Pra-Alokasi Vektor Hasil
Jika perulangan tidak dapat dihindari, pra-alokasikan vektor hasil sebelum perulangan. Memperbesar vektor dengan c(result, new_val) di dalam perulangan akan menyalin seluruh vektor pada setiap iterasi — total operasi memori O(n^2).
n <- 20000
t_grow <- system.time({
result <- c()
for (i in seq_len(n)) result <- c(result, i^2)
})['elapsed']
t_prealloc <- system.time({
result2 <- numeric(n)
for (i in seq_len(n)) result2[i] <- i^2
})['elapsed']
cat('Growing vector:', t_grow, 's
')
cat('Pre-allocated :', t_prealloc, 's
')Tipe Pra-Alokasi yang Tepat
Gunakan konstruktor bertipe yang sesuai dengan data Anda untuk menghindari koersi implisit selama pra-alokasi:
numeric(n)— bilangan pecahan presisi gandainteger(n)— bilangan bulatcharacter(n)— string kosonglogical(n)— nilai FALSEvector('list', n)— daftar berisi NULL
n <- 5
cat('numeric :', numeric(n), '
')
cat('integer :', integer(n), '
')
cat('logical :', logical(n), '
')
cat('character:', character(n), '
')
cat('list len :', length(vector('list', n)), '
')colSums() dan rowSums() vs apply()
Untuk operasi matriks, colSums(m), rowSums(m), colMeans(m), dan rowMeans(m) adalah rutin C yang sangat dioptimalkan. Fungsi-fungsi ini secara konsisten lebih cepat daripada apply(m, 1, sum), yang mengirimkan fungsi R sum sekali untuk setiap baris.
m <- matrix(rnorm(1000 * 2000), nrow = 1000)
t_apply <- system.time(apply(m, 2, sum))['elapsed']
t_colsums <- system.time(colSums(m))['elapsed']
cat('apply(m,2,sum):', t_apply, 's
')
cat('colSums(m) :', t_colsums, 's
')Aritmetika Tervectorisasi Selalu Cepat
Aritmetika dasar pada vektor — +, -, *, /, ^, sqrt(), log(), exp() — semuanya tervectorisasi. Operasi tersebut bekerja per elemen di seluruh vektor dalam satu pemanggilan C. Selalu utamakan operasi ini daripada perulangan.
x <- 1:1000000
t1 <- system.time(y <- x^2 + 2*x + 1)['elapsed']
t2 <- system.time({
y2 <- numeric(length(x))
for (i in seq_along(x)) y2[i] <- x[i]^2 + 2*x[i] + 1
})['elapsed']
cat('Vectorized:', t1, 's
')
cat('Loop :', t2, 's
')Subset Logis, Bukan Perulangan
Memfilter vektor dengan kondisi logis dilakukan secara tervectorisasi. Daripada melakukan perulangan dan menambahkan elemen secara kondisional, buat indeks logis lalu lakukan subset sekali—kode C yang mendasarinya cukup melakukan satu kali lintasan.
x <- rnorm(500000)
t_loop <- system.time({
pos <- c()
for (v in x) if (v > 0) pos <- c(pos, v)
})['elapsed']
t_vec <- system.time({
pos2 <- x[x > 0]
})['elapsed']
cat('Loop filter:', t_loop, 's
')
cat('Logical idx:', t_vec, 's
')which() dan tabulate() untuk Menangani Indeks
Saat Anda memerlukan posisi nilai TRUE, which(condition) tervectorisasi dan cepat. tabulate(bin_vector) menghitung kemunculan bilangan bulat lebih cepat daripada table() untuk rentang bilangan bulat yang padat.
x <- sample(1:10, 100000, replace = TRUE)
t_table <- system.time(table(x))['elapsed']
t_tabulate <- system.time(tabulate(x, nbins = 10))['elapsed']
cat('table() :', t_table, 's
')
cat('tabulate():', t_tabulate, 's
')
idx <- which(x == 5)
cat('Positions of 5: first 5 =', head(idx, 5), '
')Saat Perulangan Masih Dapat Digunakan
Tidak semua perulangan itu buruk. Perulangan dapat digunakan ketika:
- Setiap iterasi bergantung pada hasil sebelumnya (ketergantungan berurutan)
- Jumlah iterasinya kecil (< 1000)
- Badan perulangan memanggil fungsi kompleks yang tidak memiliki padanan tervectorisasi
Dalam kasus ini, fokuslah pada pra-alokasi dan hindari memperbesar struktur di dalam perulangan.
# Sequential dependency -- loop is correct here
fib <- function(n) {
result <- integer(n)
result[1] <- 1L
if (n >= 2) result[2] <- 1L
for (i in seq_len(n)[-c(1,2)]) result[i] <- result[i-1] + result[i-2]
result
}
cat('Fibonacci:', fib(10), '
')Ringkasan Vektorisasi
Aturan utama vektorisasi untuk kode R yang cepat:
- Gunakan
cumsum/cumprod/diffuntuk akumulasi berurutan - Gunakan
ifelse()untuk kondisi per elemen - Lakukan pra-alokasi dengan
numeric(n)/vector('list',n) - Gunakan
colSums/rowSums/colMeans/rowMeans, bukanapply() - Subset logis lebih unggul daripada perulangan pemfilteran
Pemeriksaan Cepat: Pra-alokasi
Mengapa memperbesar vektor dengan result <- c(result, new_val) di dalam perulangan sangat lambat untuk n yang besar?
Ikhtisar Vektorisasi
Vektorisasi adalah pengungkit kinerja utama R:
- Fungsi tervectorisasi (
cumsum,ifelse, operator aritmetika) memanggil kode C terkompilasi—sehingga 10–100 kali lebih cepat daripada perulangan R yang setara - Lakukan pra-alokasi wadah hasil sebelum perulangan yang tidak dapat dihindari untuk menghindari penyalinan O(n2)
colSums/rowSumslebih cepat daripadaapply()untuk agregasi matriks- Subset logis menggantikan perulangan pemfilteran dengan cara yang rapi dan cepat
Belajar R dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Vektorisasi untuk Kecepatan” gratis?
Ya — teks lengkap “Vektorisasi untuk Kecepatan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Vektorisasi untuk Kecepatan”?
Ganti perulangan eksplisit dengan operasi tervectorisasi untuk peningkatan kecepatan yang signifikan. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai R Academy?
Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Vektorisasi untuk Kecepatan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- system.time() dan proc.time()
- Membuat Profil Kode dengan Rprof dan profvis
- Vektorisasi untuk Kecepatan
- Menguji Kinerja dengan microbenchmark