2016-11-07 3 views
0

私は、100万の整数を持つベクトルを昇順に、1000個のサブセットのベクトルをソートしています。ソートされたベクトル上で複数のマッチを行うときに開始位置を定義する方が速いでしょうか?

もっと速いのは何ですか? samplevecが大きくなると、2番目のバージョンの方が速くなりますか?

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

それはベンチマークに簡単です。ここには2つの時点があります。これを抱き込み、時間のポイント数を増やすように自動化しても構いません。

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 

ここが第2のポイントです。これは少し長く実行されます。

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 
関連する問題