मेरा कोड धीमा है!

कार्यकुशल R कोड लिखना

Colin Gillespie

Jumping Rivers & Newcastle University

क्या मेरा कोड सच में धीमा है?

  • 1 सेकंड?
  • 1 मिनट?
  • 1 घंटा?
कार्यकुशल R कोड लिखना

क्या मेरा कोड सच में धीमा है?

कार्यकुशल R कोड लिखना

बेंचमार्किंग

  1. जिसे बेंचमार्क करना है, उसके लिए एक फंक्शन बनाएँ
  2. अलग परिस्थितियों में उसका समय नापें, जैसे डेटा सेट
कार्यकुशल R कोड लिखना

उदाहरण: संख्याओं का अनुक्रम

$$ 1, 2, 3, \ldots, n $$

विकल्प 1
1:n
विकल्प 2
seq(1, n)
विकल्प 3
seq(1, n, by = 1)
कार्यकुशल R कोड लिखना

फंक्शन रैपिंग

colon <- function(n) 1:n
colon(5)
1 2 3 4 5
seq_default <- function(n) seq(1, n)
seq_by <- function(n) seq(1, n, by = 1)
कार्यकुशल R कोड लिखना

system.time() से टाइमिंग

system.time(colon(1e8))
#   user  system elapsed
#  0.032   0.028   0.060
system.time(seq_default(1e8))
#   user  system elapsed
#  0.060   0.028   0.086
system.time(seq_by(1e8))
#   user  system elapsed
#  1.088   0.520   1.600
  • user time वह CPU समय है जो यूज़र इंस्ट्रक्शंस के निष्पादन पर लगता है।
    • system time वह CPU समय है जो सिस्टम कॉलिंग प्रोसेस की ओर से उपयोग करता है।
    • elapsed time लगभग user और system का योग होता है; आमतौर पर हम इसी संख्या की परवाह करते हैं।
कार्यकुशल R कोड लिखना

परिणाम स्टोर करना

system.time(colon(1e8))

की समस्या यह है कि हमने परिणाम स्टोर नहीं किया। परिणाम रखने के लिए कोड फिर चलाना होगा:

res <- colon(1e8)

<- ऑपरेटर दोनों काम करता है:

  • आर्गुमेंट पासिंग
  • ऑब्जेक्ट असाइन्मेंट
system.time(res <- colon(1e8))

= ऑपरेटर इनमें से एक करता है:

  • आर्गुमेंट पासिंग
  • ऑब्जेक्ट असाइन्मेंट
# त्रुटि उत्पन्न होगी
system.time(res = colon(1e8))
कार्यकुशल R कोड लिखना

रिलेटिव टाइम

Method Absolute time (secs) Relative time
colon(n) 0.060 $0.060/0.060 = 1.00$
seq_default(n) 0.086 $0.086/0.060 = 1.40$
seq_by(n) 1.607 $1.60/0.060 = 26.7$
कार्यकुशल R कोड लिखना

microbenchmark पैकेज

  • फंक्शंस की तुलना करता है
    • हर फंक्शन कई बार चलाया जाता है
library("microbenchmark")

n <- 1e8 microbenchmark(colon(n), seq_default(n), seq_by(n), times = 10) # हर फंक्शन 10 बार चलाएँ
# Unit: milliseconds
#           expr  min   lq  mean  median   uq  max neval cld
#       colon(n)   59  130   220     202  341  391    10  a
# seq_default(n)   94  204   290     337  348  383    10  a
#      seq_by(n) 1945 2044  2260    2275 2359 2787    10   b
कार्यकुशल R कोड लिखना

अभ्यास करते हैं!

कार्यकुशल R कोड लिखना

Preparing Video For Download...