裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

プログラムの最適化?

2011年06月24日 | ブログラミング

元のプログラム

system.time({set.seed(12345)
hits <- res <- 1:1000
for (j in 1:1000) {
for (i in 1:1000) { res[i] <- ifelse((20 %in% sample(0:99,50,replace=TRUE)),1,0) }
hits[j] <- sum(res) }
hist(hits)
print(summary(hits))
})
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#  349.0   384.0   395.0   394.7   405.0   440.0
#   ユーザ   システム       経過
#    57.292      0.784     57.598

少しずつ書き換えてみる

system.time({set.seed(12345)
hits <- replicate(1000,
sum(replicate(1000, 20 %in% sample(0:99, 50, replace=TRUE))))
hist(hits)
print(summary(hits))
})
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#  349.0   384.0   395.0   394.7   405.0   440.0
#   ユーザ   システム       経過
#    30.168      0.651     30.599

次,

system.time({set.seed(12345)
x <- array(sample(0:99, 50*1000*1000, replace=TRUE), dim=c(50, 1000, 1000))
hits <- apply(x, 3, function(y) sum(apply(y, 2, function(z) any(z == 20))))
hist(hits)
print(summary(hits))
})
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#  349.0   384.0   395.0   394.7   405.0   440.0
#   ユーザ   システム       経過
#    17.678      1.631     19.786



system.time({set.seed(12345)
hits <- replicate(1000,  {
x <- matrix(sample(0:99, 50*1000, replace=TRUE), 50)
sum(apply(x, 2, function(y) any(y == 20)))
})
hist(hits)
print(summary(hits))
})
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#  349.0   384.0   395.0   394.7   405.0   440.0
#   ユーザ   システム       経過
#    18.812      0.450     19.171



system.time({set.seed(12345)
x <- matrix(sample(0:99, 50*1000*1000, replace=TRUE), 50)
hits <- colSums(matrix(apply(x, 2, function(y) any(y == 20)), 1000))
hist(hits)
print(summary(hits))
})
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#  349.0   384.0   395.0   394.7   405.0   440.0
#   ユーザ   システム       経過
#    23.416      1.489     25.095

system.time({set.seed(12345)
x <- matrix(sample(0:99, 50*1000*1000, replace=TRUE) == 20, 50)
hits <- colSums(matrix(colSums(x) > 0, 1000))
hist(hits)
print(summary(hits))
})
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#  349.0   384.0   395.0   394.7   405.0   440.0
#   ユーザ   システム       経過 
#     2.978      3.711     21.218

ユーザ時間は短くなったけど,経過時間は余り差がない(どういうことなんだろうか)

system.time({set.seed(12345)
x <- matrix(sample(0:99, 50*1000*1000, replace=TRUE) == 20, 50)
gc() # ゴミ掃除
hits <- colSums(matrix(colSums(x), 1000) > 0)
hist(hits)
print(summary(hits))
})
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#  349.0   384.0   395.0   394.7   405.0   440.0
#   ユーザ   システム       経過 
#     2.818      1.268      4.403

ゴミ掃除やると早くなった

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村