元のプログラム
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
ゴミ掃除やると早くなった