Стратегии для более эффективного и быстрого способа печати значений в выводе консоли в R - PullRequest
0 голосов
/ 22 февраля 2019

Ребята, Спасибо, что нашли время на пост.Я хотел попросить общие стратегии, чтобы улучшить ускорение вычислений, а также ускорить процесс печати некоторых значений в окне консоли, зацикливая очень простые вычисления.

Например, я провел небольшую симуляцию лотереикод.Код ниже сгенерирует 6 выигрышных номеров от 1 до 49.И затем он продолжает рисовать 6 чисел снова семь раз за раз, пока они не совпадают с выигрышным числом.

Он будет отображать 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 чисел за семь раз

2) Самый быстрый и самый плавный способ распечатки этих семи рисунков и повторения по одной строке за раз.(например, без функции Sys.sleep() или текущей настройки Sys.sleep (0,0001) консоль выводит строки с задержкой примерно через 30 секунд работы функции. Я хочу знать, как избежать этой задержки в процессе печати.)

Цель этого поста - повысить мою эффективность и лучше понять процесс печати консоли в R.

Большое вам спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Это сокращает время вычислений для 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, поэтому избегаянужно делать каждый шаг семь раз.Я также добавил опцию, чтобы установить конкретное начальное число для воспроизводимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...