2017-09-12 26 views
5

निम्नलिखित बेंचमार्क (Windows मशीन पर आर 3.4.1) पर विचार करें:समय अंतर वस्तुओं

library(rbenchmark) 

mtx <- matrix(runif(1e8), ncol = 100) 
df <- as.data.frame(mtx) 

colnames(mtx) <- colnames(df) <- paste0("V", 1:100) 

benchmark(
    mtx[5000:7000, 80], 
    mtx[5000:7000, "V80"], 
    mtx[, "V80"][5000:7000], 
    mtx[, "V80", drop = FALSE][5000:7000, ], 
    mtx[5000:7000, , drop = FALSE][, "V80"], 
    #mtx$V80[5000:7000], # does not apply 
    replications = 5000 
) 

##          test replications elapsed relative user.self sys.self user.child sys.child 
## 4 mtx[, "V80", drop = FALSE][5000:7000, ]   5000 64.71 588.273  47.44 16.61   NA  NA 
## 3     mtx[, "V80"][5000:7000]   5000 72.15 655.909  52.90 18.18   NA  NA 
## 2     mtx[5000:7000, "V80"]   5000 0.11 1.000  0.11  0.00   NA  NA 
## 5 mtx[5000:7000, , drop = FALSE][, "V80"]   5000 7.47 67.909  5.89  1.47   NA  NA 
## 1      mtx[5000:7000, 80]   5000 0.13 1.182  0.12  0.00   NA  NA 

benchmark(
    df[5000:7000, 80], 
    df[5000:7000, "V80"], 
    df[, "V80"][5000:7000], 
    df[, "V80", drop = FALSE][5000:7000, ], 
    df[5000:7000, , drop = FALSE][, "V80"], 
    df$V80[5000:7000], 
    replications = 5000 
) 

##          test replications elapsed relative user.self sys.self user.child sys.child 
## 6      df$V80[5000:7000]   5000 0.13 1.000  0.12  0.00   NA  NA 
## 4 df[, "V80", drop = FALSE][5000:7000, ]   5000 0.33 2.538  0.33  0.00   NA  NA 
## 3     df[, "V80"][5000:7000]   5000 0.17 1.308  0.17  0.00   NA  NA 
## 2     df[5000:7000, "V80"]   5000 0.15 1.154  0.16  0.00   NA  NA 
## 5 df[5000:7000, , drop = FALSE][, "V80"]   5000 13.63 104.846  12.91  0.39   NA  NA 
## 1      df[5000:7000, 80]   5000 0.19 1.462  0.17  0.00   NA  NA 

समय अंतर बहुत नाटकीय है। ऐसा क्यों है? सबसेटिंग का अनुशंसित तरीका क्या है और क्यों? बेंचमार्क को देखते हुए, mtx[i, colname] मैट्रिक्स और df$colname[i] के लिए रास्ता (लेकिन यह बहुत अंतर नहीं लग रहा है) डेटा.फ्रेम के लिए सबसे अधिक समय-कुशल लगता है, लेकिन क्या कोई सामान्य कारण हैं कि हमें किसी भी दृष्टिकोण को क्यों पसंद करना चाहिए?

+1

डेटा.फ्रेम के लिए $ --extraction हमेशा अनुशंसित नहीं है। यह केवल इंटरैक्टिव उपयोग के लिए है। आप 'डीएफ [["वी 80"]] 'और' डीएफ [[80]]' निष्कर्षण विधियों को जोड़ सकते हैं। –

+0

बस अपने विशेष मैट्रिक्स/डेटा.फ्रेम के लिए सबसे तेज़ उपयोग करें (मान लें कि उप सेटिंग की गति आपके कोड का अवरुद्ध हिस्सा भी है)। यह आमतौर पर दो '[] [] 'के बजाय एक सबसेटिंग ऑपरेशन' [] 'करना बेहतर होता है। आपके पास अलग-अलग विकल्प हैं ताकि आप चुन सकें कि कौन सा अधिक पठनीय है या आपके कोड को समझने में आसान बनाता है। – MrFlick

उत्तर

1

मुख्य कारण matrices और data.frames के पीछे आर डेटा संरचनाओं में निहित है। एक मैट्रिक्स मूल रूप से राउनंबर x कॉलमंबर (मुख्य रूप से संख्यात्मक) प्रविष्टियों के साथ एक वस्तु है (आर के डिफ़ॉल्ट द्वारा एक मैट्रिक्स स्पैस नहीं है) और एक आयाम संपत्ति है। इस कारण से, अपने पहले 2 आदेशों

mtx[5000:7000, 80], 
mtx[5000:7000, "V80"] 

निकालने फिर matrices जिसके लिए आर केवल मान निर्दिष्ट नहीं करता है, लेकिन यह भी आयाम नए मैट्रिक्स बनाने सरल वैक्टर जो आर के डिफ़ॉल्ट वस्तुओं रहे हैं के बजाय वस्तुओं के लिए।

दूसरी ओर, आर में डेटा.फ्रेम परिभाषा के अनुसार एक विशेष प्रकार की सूची वस्तु है जहां प्रत्येक कॉलम ऑब्जेक्ट की लंबाई समान होती है, जबकि कॉलम में विभिन्न प्रकार के चर (संख्यात्मक, स्ट्रिंग इत्यादि) हो सकते हैं। ।)। Matrices में केवल एक प्रकार का चर हो सकता है जो डिफ़ॉल्ट रूप से सबसे सामान्य होगा। इस प्रकार,

df[5000:7000, 80] 

80 वें स्तंभ के वेक्टर और तब स्थिति 5000-7000 पर मानों यह एक से बाहर निकालता है। एक वेक्टर एक मैट्रिक्स ऑब्जेक्ट की तुलना में आर के लिए संभालने के लिए कहीं अधिक सरल है और इसलिए, यह बहुत तेज़ है।

यदि आप ड्रॉप = FALSE चुनते हैं, तो, आप 80 वें कॉलम का चयन करते समय एक साधारण वेक्टर ऑब्जेक्ट के साथ काम नहीं करने के लिए मजबूर करते हैं, लेकिन इसके बजाय इसे डेटा.फ्रेम/सूची ऑब्जेक्ट का इलाज करें। सूचियां सबसे सामान्य और लचीली प्रकार के आर ऑब्जेक्ट्स हैं, क्योंकि उनके आकार और प्रविष्टियों के बारे में कोई बाधा नहीं है, लेकिन यह कीमत पर आता है कि वे सबसे कठिन और संभालने में समय लेते हैं, जैसा कि आप

mtx[5000:7000, , drop = FALSE][, "V80"] 
df[5000:7000, , drop = FALSE][, "V80"] 
की तुलना करते समय देख सकते हैं

डेटा फ्रेम से आप एक और डेटा प्राप्त कर सकते हैं। फ्रेम/सूची, जबकि मैट्रिक्स अभी भी एक मैट्रिक्स देता है जो सूची की तुलना में अभी भी तेज़ है।

संबंधित मुद्दे