r - 在 R 的控制台输出中更有效和更快地打印值的策略
问题描述
伙计们感谢您花一些时间在帖子中。我想寻求通用策略来提高计算速度,以及加快控制台窗口中某些值的打印过程,同时循环非常简单的计算。
例如,我做了一个小彩票模拟代码。下面的代码将首先生成从 1 到 49 的 6 个中奖号码。然后它会继续抽 6 个号码,一次抽 7 次,直到它们匹配中奖号码。
它将在一行中显示 7 次抽奖和迭代(即抽奖次数),直到它们与中奖号码匹配。
Lottery = function(computetime=FALSE){
# winning numbers
sixnumber = sample(1:49, 6, replace=FALSE)
getfirst1 = getfirst2 = getfirst3 = getfirst4 = getfirst5 = getfirst6 = getfirst7 = 0
iter=0
if(computetime==FALSE){
# loop until we have match winning number from 7 draws
while(! 6 %in% c(getfirst1, getfirst2, getfirst3, getfirst4, getfirst5, getfirst6, getfirst7)){
iter=iter+7
draw1 = sample(1:49, 6, replace=FALSE)
draw2 = sample(1:49, 6, replace=FALSE)
draw3 = sample(1:49, 6, replace=FALSE)
draw4 = sample(1:49, 6, replace=FALSE)
draw5 = sample(1:49, 6, replace=FALSE)
draw6 = sample(1:49, 6, replace=FALSE)
draw7 = sample(1:49, 6, replace=FALSE)
# added for line to be arranged consistantly by formatting the numbers in each draw
draw1[draw1<10] = paste0(0,draw1[draw1<10])
draw2[draw2<10] = paste0(0,draw2[draw2<10])
draw3[draw3<10] = paste0(0,draw3[draw3<10])
draw4[draw4<10] = paste0(0,draw4[draw4<10])
draw5[draw5<10] = paste0(0,draw5[draw5<10])
draw6[draw6<10] = paste0(0,draw6[draw6<10])
draw7[draw7<10] = paste0(0,draw7[draw7<10])
# sum of the matching numbers in each draw
getfirst1 = sum(sixnumber %in% draw1)
getfirst2 = sum(sixnumber %in% draw2)
getfirst3 = sum(sixnumber %in% draw3)
getfirst4 = sum(sixnumber %in% draw4)
getfirst5 = sum(sixnumber %in% draw5)
getfirst6 = sum(sixnumber %in% draw6)
getfirst7 = sum(sixnumber %in% draw7)
# Print out in console
cat(draw1, " ", draw2, " ", draw3, " ", draw4, " ", draw5, " " , draw6, " " , draw7, " ", iter, "\n")
# without Sys.sleep, printing process will be slowed down and get lagged
Sys.sleep(time=0.0001)
}
return(sixnumber)
}else{
# This part will test the time until 3500 draws
a=Sys.time()
while(iter != 3500){
iter=iter+7
draw1 = sample(1:49, 6, replace=FALSE)
draw2 = sample(1:49, 6, replace=FALSE)
draw3 = sample(1:49, 6, replace=FALSE)
draw4 = sample(1:49, 6, replace=FALSE)
draw5 = sample(1:49, 6, replace=FALSE)
draw6 = sample(1:49, 6, replace=FALSE)
draw7 = sample(1:49, 6, replace=FALSE)
draw1[draw1<10] = paste0(0,draw1[draw1<10])
draw2[draw2<10] = paste0(0,draw2[draw2<10])
draw3[draw3<10] = paste0(0,draw3[draw3<10])
draw4[draw4<10] = paste0(0,draw4[draw4<10])
draw5[draw5<10] = paste0(0,draw5[draw5<10])
draw6[draw6<10] = paste0(0,draw6[draw6<10])
draw7[draw7<10] = paste0(0,draw7[draw7<10])
getfirst1 = sum(sixnumber %in% draw1)
getfirst2 = sum(sixnumber %in% draw2)
getfirst3 = sum(sixnumber %in% draw3)
getfirst4 = sum(sixnumber %in% draw4)
getfirst5 = sum(sixnumber %in% draw5)
getfirst6 = sum(sixnumber %in% draw6)
getfirst7 = sum(sixnumber %in% draw7)
cat(draw1, " ", draw2, " ", draw3, " ", draw4, " ", draw5, " " , draw6, " " , draw7, " ", iter, "\n")
Sys.sleep(time=0.0001)
}
b=Sys.time()
cat(b-a, "Seonds for 3500 draws")
}
}
Lottery(computetime = TRUE)
我想获得一些关于如何加快
1) 一次对 6 个数字进行 7 次采样的计算
2) 打印出这七张画并一次迭代一行的最快和最流畅的方式。(例如,没有Sys.sleep()
函数或当前设置 Sys.sleep(0.0001),控制台在运行该函数 30 秒后打印出有滞后的行。我想知道如何避免打印过程中的这种滞后。)
这篇文章的目的是提高我的效率并更多地了解 R 中的打印控制台过程。
太感谢了!
解决方案
这将 3500 次绘制的计算时间从大约 9 秒减少到大约 1.5 秒:
Lottery = function(computetime=FALSE, seed = 1){
set.seed(seed)
# winning numbers
sixnumber = sample(1:49, 6, replace=FALSE)
getfirst <- as.list(rep(0, 7))
iter=0
if(computetime==FALSE){
# loop until we have match winning number from 7 draws
while(!any(unlist(getfirst) == 6)){
iter=iter+7
draw <- lapply(1:7, function(x) sample(1:49, 6))
# sum of the matching numbers in each draw
getfirst <- lapply(draw, function(x) sum(sixnumber %in% x))
# Print out in console
draw <- lapply(draw, function(x) {x[x < 10] <- paste0(0, x[x < 10]); x})
cat(sapply(draw, paste, collapse = " "), sep = "\n")
# without Sys.sleep, printing process will be slowed down and get lagged
Sys.sleep(time=0.0001)
}
return(sixnumber)
}else{
# This part will test the time until 3500 draws
a=Sys.time()
while(iter != 3500){
iter=iter+7
draw <- lapply(1:7, function(x) sample(1:49, 6))
getfirst <- lapply(draw, function(x) sum(sixnumber %in% x))
draw <- lapply(draw, function(x) {x[x < 10] <- paste0(0, x[x < 10]); x})
cat(sapply(draw, paste, collapse = " "), sep = "\n")
Sys.sleep(time=0.0001)
}
b=Sys.time()
cat(b-a, "Seconds for 3500 draws")
}
}
我们使用列表能够有效地循环lapply
和sapply
,因此避免了每一步都执行七次的需要。我还添加了为可重复性设置特定种子的选项。
推荐阅读
- python - zeep calling method that takes nested complexType input
- gremlin - Why isn't a element returned in tinkerpop gremlin query?
- python - Why column in a dataframe is getting filled with only one value always
- c# - How to make the background of ”TextEdit“ transparent?
- php - Order array by date in PHP?
- python-3.x - How can I insert daily values back into hourly dataframe
- google-bigquery - Not able to parse date information in Google BigQuery
- flutter - Two animations at the same time without setstate
- vba - compatibility 32bit-excel and 64-bit excel (office 365)
- python - How to get ranges of spreadsheets after applying filter in google sheets API?