2016-11-07 47 views
0

我有一個100萬整數的矢量,按升序排列,還有一個矢量,這些整數的子集也是1000個,也是排序的。在排序後的矢量上執行多個匹配時會定義一個起始位置會更快嗎?

什麼會更快?如果samplevec變得更大,第二個版本會變得更快嗎?

samplevec=sort(sample(1:10000000, 1000000)) 
matchvec=sort(sample(samplevec, 10000)) 

for (i in matchvec) { 
index=match(i, samplevec) 
print(index) 
} 

或者

samplevec=sort(sample(1:10000000, 1000000)) 
matchvec=sort(sample(samplevec, 10000)) 

previous=1 
for (i in matchvec) { 
index=match(i, samplevec[previous:length(samplevec)]) 
previous=index 
print(index) 
} 

回答

1

這很容易標杆。這裏只是兩個時間點。隨意皮條客和自動化,以增加時間點的數量。

library(microbenchmark) 

set.seed(357) 

samplevec = sort(sample(1:1000, 1000)) 
matchvec = sort(sample(samplevec, 1000)) 

microbenchmark(
    version1 = { 
    previous=1 
    for (i in matchvec) { 
     index=match(i, samplevec[previous:length(samplevec)]) 
     previous=index 
    }}, 
    version2 = { 
    for (i in matchvec) { 
     index = match(i, samplevec) 
    }} 
) 

Unit: milliseconds 
    expr  min  lq  mean median  uq 
version1 10.619105 10.711438 12.057713 10.811051 12.71902 
version2 2.419441 2.487062 2.853868 2.506603 2.56024 

這是第二點。這一個稍微長一點。

set.seed(357) 

samplevec = sort(sample(1:100000, 100000)) 
matchvec = sort(sample(samplevec, 100000)) 

microbenchmark(
    version1 = { 
    previous=1 
    for (i in matchvec) { 
     index=match(i, samplevec[previous:length(samplevec)]) 
     previous=index 
    }}, 
    version2 = { 
    for (i in matchvec) { 
     index=match(i, samplevec) 
    }} 
) 

Unit: seconds 
    expr  min  lq  mean median  uq 
version1 108.96069 109.61137 110.87308 110.70554 111.61337 
version2 15.63668 15.71792 16.20434 15.84646 16.07487 
相關問題