Pengulangan di R lambat karena alasan yang sama dengan bahasa apa pun yang ditafsirkan lambat: setiap operasi membawa banyak bagasi ekstra.
Lihat R_execClosure
dieval.c
(ini adalah fungsi yang dipanggil untuk memanggil fungsi yang ditentukan pengguna). Panjangnya hampir 100 baris dan melakukan semua jenis operasi - menciptakan lingkungan untuk eksekusi, menetapkan argumen ke lingkungan, dll.
Pikirkan berapa banyak yang terjadi ketika Anda memanggil fungsi di C (dorong args ke stack, jump, pop args).
Jadi itulah mengapa Anda mendapatkan pengaturan waktu seperti ini (seperti yang ditunjukkan joran dalam komentar, sebenarnya bukan apply
itu yang cepat; itu adalah loop C internal mean
yang menjadi cepat. apply
Hanya kode R lama biasa):
A = matrix(as.numeric(1:100000))
Menggunakan loop: 0,342 detik:
system.time({
Sum = 0
for (i in seq_along(A)) {
Sum = Sum + A[[i]]
}
Sum
})
Menggunakan jumlah: sangat kecil:
sum(A)
Ini sedikit membingungkan karena, secara asimtotik, loop sama baiknya dengan sum
; tidak ada alasan praktis mengapa harus lambat; itu hanya melakukan lebih banyak pekerjaan ekstra setiap iterasi.
Jadi pertimbangkan:
system.time({
I = 0
while (I < 100000) {
10
I = I + 1
}
})
system.time({
I = 0
while (I < 100000) {
((((((((((10))))))))))
I = I + 1
}
})
(Contoh itu ditemukan oleh Radford Neal )
Karena (
di R adalah operator, dan sebenarnya membutuhkan pencarian nama setiap kali Anda menggunakannya:
> `(` = function(x) 2
> (3)
[1] 2
Atau, secara umum, operasi yang ditafsirkan (dalam bahasa apa pun) memiliki lebih banyak langkah. Tentu saja, langkah-langkah memberikan manfaat juga: Anda tidak bisa melakukan itu (
trik di C.
system.time
perang dalam jawaban dimulai ...