La demande de 100 serveurs ne peut pas être un code optimisé. On met une virgule

Un certain nombre d'algorithmes peuvent être distingués qui sont basiques et sous-tendent presque chaque ligne de programmes écrits dans des langages de haut niveau. Il est bon d'avoir à portée de main l'ouvrage classique en plusieurs volumes de Donald Knuth "The Art of Computer Programming" , où de nombreux algorithmes de base sont analysés en détail. Mais lire et tout assimiler est une tâche qui demande beaucoup d'efforts et de temps, qui doit en quelque sorte être motivée.







Beaucoup peuvent supposer qu'il était nécessaire de connaître les nuances il y a 50 ans, mais vous pouvez maintenant utiliser des packages et des fonctions prêts à l'emploi et ne pas plonger dans les détails. Cependant, ce n'est pas le cas. De même, personne n'a annulé l'importance de comprendre la représentation des méthodes de stockage des données en mémoire et de leur traitement dans le processeur.







. . .







.









, . , , .







, , :







  • case_id



    — /;
  • record



    — ;
  • start



    — .








library(tidyverse)
library(data.table)
library(rTRNG)
      
      





. . "". . 10^5-10^n



, .







#   
nn <- 100
#    
records <- c("first", "one and a half", "second", "third", "fourth", 
             "fifth", "sixth")

#     
df <- tibble(case_id = 1:nn, recs = list(records)) %>%
  unnest(recs)

dt <- as.data.table(df)[, case_id := as.numeric(case_id)]
#       
setkey(dt, case_id)

head(df, 10)
      
      





  # A tibble: 10 x 2
     case_id recs          
       <int> <chr>         
   1       1 first         
   2       1 one and a half
   3       1 second        
   4       1 third         
   5       1 fourth        
   6       1 fifth         
   7       1 sixth         
   8       2 first         
   9       2 one and a half
  10       2 second  
      
      





— . [0; 1]



. unixtimestamp , . . , , .









1.



. , .







f1 <- function(df) {
  df %>%
    group_by(case_id) %>%
    mutate(t_idx = sort(runif(n(), 0, 1))) %>%
    ungroup()
}
      
      





. , . , 100 .







  median `itr/sec` mem_alloc
 15.38ms      63.2   284.9KB
      
      





, ?







1+1/2. +



rTRNG



. , , . :







f1_5 <- function(df) {
  df %>%
    group_by(case_id) %>%
    mutate(t_idx = sort(runif_trng(n(), 0, 1))) %>%
    ungroup()
}
      
      





  median `itr/sec` mem_alloc
 29.34ms      29.5   284.9KB
      
      





. ? . , tidyverse



data.table



, .







2. , data.table



— , .







f2 <- function(dt) {
  #    ,       `case_id``
  #        
  vec <- dt[, t_idx := runif_trng(.N, 0, 1)][order(case_id, t_idx), t_idx]
  #   
  dt[, t_idx := vec]
}
      
      





, 15-20 .







  median `itr/sec` mem_alloc 
  1.69ms     554.      109KB 
      
      





? ?







3. ,



, , , by



, . . — , . . [0; 1]



, . case_id



, — . case_id



,







f3 <- function(dt) {
  #  ,     case_id,   ,    
  #       [0, 1],       ( )
  #       0  1     
  #    
  dt[, t_idx := sort(case_id + runif_trng(.N, 0, 1, parallelGrain = 10000L)) - case_id]
}
      
      





2 , , .







  median `itr/sec` mem_alloc
 826.7us    1013.     54.3KB
      
      





3+1/2. , , set





? , . , NSE . , .







f3_5 <- function(dt) {
  set(dt, j = "t_idx", 
      value = sort(dt$case_id + runif(nrow(dt), 0, 1)) - dt$case_id)
}
      
      





5 , 4







  median `itr/sec` mem_alloc
 161.5us    5519.     16.3KB
      
      







.







bench::mark(
  f1(df),
  f1_5(df),
  f2(dt),
  f3(dt),
  f3_5(dt),
  check = FALSE
)
      
      





  expression      min   median `itr/sec` mem_alloc
  <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>
1 f1(df)       14.3ms  15.38ms      63.2   284.9KB
2 f1_5(df)    24.43ms  29.34ms      29.5   284.9KB
3 f2(dt)       1.55ms   1.69ms     554.      109KB
4 f3(dt)        722us  826.7us    1013.     54.3KB
5 f3_5(dt)    142.5us  161.5us    5519.     16.3KB
      
      





90 , 18 . , .









. (" "). .







, . .







1.



— , , , . , , , , , . . :







# C   -- case_id, record, start, finish
#    ,     finish > start 
#      1, 2    start_2 > finish_1 

dt[, t_idx := NULL] #    

f1 <- function(df) {
  df %>%
    group_by(case_id) %>%
    mutate(ts_idx = sort(runif(n(), 0, 1))) %>%
    ungroup() %>%
    #    ,       
    #   NaN     (  max < min), 
    #    1   , NA       1
    mutate(tf_idx = {lead(ts_idx, default = 1) %>% if_else(. > ts_idx, ., 1)}) %>%
    mutate(tf_idx = map2_dbl(ts_idx, tf_idx, ~runif(1, .x, .y)))
}
      
      





, , , .







  median `itr/sec` mem_alloc 
 28.16ms      30.7    2.06MB 
      
      





2. ,



. 2 , . ! — , . .







f2 <- function(dt){
  dt[, c("ts_idx", "tf_idx") := {
    #   vector recycling
    x <- case_id + runif(2 * .N, 0, 1);
    m <- matrix(sort(x), ncol = 2, byrow = TRUE) - case_id;
    list(m[, 1], m[, 2])
  }]
}
      
      





30 ! .







  median `itr/sec` mem_alloc 
  1.04ms     733.    74.38KB 
      
      





2+1/2. , , set





f2_5 <- function(dt){
  x <- dt$case_id + runif(2 * nrow(dt), 0, 1)
  m <- matrix(sort(x), ncol = 2, byrow = TRUE) - dt$case_id
  set(dt, j = "ts_idx", value = m[, 1])
  set(dt, j = "tf_idx", value = m[, 2])
}
      
      





. 4 .







  median `itr/sec` mem_alloc 
 278.1us    2781.    57.55KB 
      
      







.







bench::mark(
  f1(df),
  f2(dt),
  f2_5(dt),
  check = FALSE
)
      
      





  median `itr/sec` mem_alloc 
 28.16ms      30.7    2.06MB 
  1.04ms     733.    74.38KB 
 278.1us    2781.    57.55KB 
      
      





90 , 35 .









, . , , , . , , . — , . . , .







, BigData , , - .







P.S.

, . -



— . .

- .







« R».







ruvds







ruvds








All Articles