Meminta 100 server tidak dapat dioptimalkan kode. Kami menempatkan koma

Sejumlah algoritma dapat dibedakan yang mendasar dan mendasari hampir setiap baris program yang ditulis dalam bahasa tingkat tinggi. Adalah baik untuk memiliki karya multivolume klasik Donald Knuth "The Art of Computer Programming" , di mana banyak algoritma dasar dianalisis secara rinci. Tetapi membaca dan mengasimilasi semuanya adalah tugas yang membutuhkan banyak usaha dan waktu, yang entah bagaimana harus dimotivasi.







Banyak yang mungkin berasumsi bahwa perlu mengetahui nuansa 50 tahun yang lalu, tetapi sekarang Anda dapat menggunakan paket dan fungsi yang sudah jadi dan tidak menyelami detailnya. Namun, ini tidak terjadi. Demikian juga, tidak ada yang membatalkan pentingnya memahami representasi metode untuk menyimpan data dalam memori dan memprosesnya dalam prosesor.







. . .







.









, . , , .







, , :







  • 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