কখনও কখনও আমাদের লুপগুলি ব্যবহার করতে হয়, উদাহরণস্বরূপ, যখন আমরা জানি না যে ফলাফলটি পেতে আমাদের কতগুলি পুনরাবৃত্তি প্রয়োজন। উদাহরণস্বরূপ লুপগুলি গ্রহণ করুন। নীচে আপনার নিখুঁত উপায়গুলি এড়ানো উচিত:
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
এগুলি খুব অযোগ্য, কারণ প্রতিবার ভেক্টরটি এটি সংযুক্ত করার সাথে অনুলিপি করে।
সংযোজনের সবচেয়ে কার্যকরী উপায় হ'ল সূচি ব্যবহার করা। নোট করুন যে এবার আমি এটি 1e7 বার পুনরাবৃত্তি করতে দিয়েছি, তবে এটি এখনও এর চেয়ে অনেক দ্রুত c
।
a=numeric(0)
system.time(
{
while(length(a)<1e7){
a[length(a)+1]=pi
}
}
)
# user system elapsed
# 5.71 0.39 6.12
এটি গ্রহণযোগ্য। এবং আমরা তা প্রতিস্থাপন একটু দ্রুততর করতে পারেন [
সঙ্গে [[
।
a=numeric(0)
system.time(
{
while(length(a)<1e7){
a[[length(a)+1]]=pi
}
}
)
# user system elapsed
# 5.29 0.38 5.69
হতে পারে আপনি ইতিমধ্যে লক্ষ্য করেছেন যে length
সময় সাপেক্ষ হতে পারে। আমরা যদি length
কাউন্টার দিয়ে প্রতিস্থাপন করি :
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
অন্য ব্যবহারকারীরা যেমন উল্লেখ করেছেন, ভেক্টরকে প্রাক-বরাদ্দ করা খুব সহায়ক। তবে গতি এবং মেমরির ব্যবহারের মধ্যে এটি একটি বাণিজ্য is
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
একটি মধ্যবর্তী পদ্ধতি হ'ল ধীরে ধীরে ফলাফলের ব্লক যুক্ত করা।
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
; অথবা আপনি ভেক্টর = ভেক্টর + মানগুলি করতে পারেন। তবে আমি আপনার ব্যবহারের ক্ষেত্রে ভুল বোঝাবুঝি করছি