Terkadang kita harus menggunakan loop, misalnya, ketika kita tidak tahu berapa banyak iterasi yang kita butuhkan untuk mendapatkan hasilnya. Ambil while loop sebagai contoh. Berikut adalah metode yang harus Anda hindari:
a=numeric(0)
b=1
system.time(
{
while(b<=1e5){
b=b+1
a<-c(a,pi)
}
}
)
# user system elapsed
# 13.2 0.0 13.2
a=numeric(0)
b=1
system.time(
{
while(b<=1e5){
b=b+1
a<-append(a,pi)
}
}
)
# user system elapsed
# 11.06 5.72 16.84
Ini sangat tidak efisien karena R menyalin vektor setiap kali ditambahkan.
Cara paling efisien untuk menambahkan adalah dengan menggunakan indeks. Perhatikan bahwa saat ini saya membiarkannya mengulangi 1e7 kali, tetapi masih jauh lebih cepat daripada c
.
a=numeric(0)
system.time(
{
while(length(a)<1e7){
a[length(a)+1]=pi
}
}
)
# user system elapsed
# 5.71 0.39 6.12
Ini bisa diterima. Dan kita bisa membuatnya sedikit lebih cepat dengan mengganti [
dengan [[
.
a=numeric(0)
system.time(
{
while(length(a)<1e7){
a[[length(a)+1]]=pi
}
}
)
# user system elapsed
# 5.29 0.38 5.69
Mungkin Anda sudah memperhatikan bahwa itu length
bisa memakan waktu. Jika kami ganti length
dengan penghitung:
a=numeric(0)
b=1
system.time(
{
while(b<=1e7){
a[[b]]=pi
b=b+1
}
}
)
# user system elapsed
# 3.35 0.41 3.76
Seperti yang disebutkan pengguna lain, pra-alokasi vektor sangat membantu. Tapi ini adalah trade-off antara kecepatan dan penggunaan memori jika Anda tidak tahu berapa banyak loop yang Anda butuhkan untuk mendapatkan hasilnya.
a=rep(NaN,2*1e7)
b=1
system.time(
{
while(b<=1e7){
a[[b]]=pi
b=b+1
}
a=a[!is.na(a)]
}
)
# user system elapsed
# 1.57 0.06 1.63
Metode perantara adalah secara bertahap menambahkan blok hasil.
a=numeric(0)
b=0
step_count=0
step=1e6
system.time(
{
repeat{
a_step=rep(NaN,step)
for(i in seq_len(step)){
b=b+1
a_step[[i]]=pi
if(b>=1e7){
a_step=a_step[1:i]
break
}
}
a[(step_count*step+1):b]=a_step
if(b>=1e7) break
step_count=step_count+1
}
}
)
#user system elapsed
#1.71 0.17 1.89
vector = values
; atau Anda bisa melakukan nilai vektor = vektor +. Tapi saya mungkin salah paham dengan use case Anda