कैसे समझा जा सकता है पहले से समेकित डेटा के लिए कुछ नमूनाकरण कार्यों को बनाने की प्रक्रिया में मैंने पाया कि तालिका उस आकार डेटा पर धीमी थी जो मैं काम कर रहा हूं। मैं के रूप मेंटैबलेट का आरसीपीपी संस्करण धीमा है; यह कहां से है,
// [[Rcpp::export]]
IntegerVector getcts(NumericVector x, int m) {
IntegerVector cts(m);
int t;
for (int i = 0; i < x.length(); i++) {
t = x[i] - 1;
if (0 <= t && t < m)
cts[t]++;
}
return cts;
}
इस प्रकार है और फिर समझने के लिए क्यों तालिका बल्कि मैंने पाया यह सारणीबद्ध के आधार पर की जा रही धीमी गति से किया गया था की कोशिश कर रहा है, जबकि दोनों के सुधार, पहले एक Rcpp समारोह की कोशिश की। Tabulate मेरे लिए अच्छी तरह से काम करता है, और आरसीपीपी संस्करण से तेज है। सारणीबद्ध के लिए कोड है पर:
https://github.com/wch/r-source/blob/545d365bd0485e5f0913a7d609c2c21d1f43145a/src/main/util.c#L2204
कुंजी लाइन किया जा रहा है के साथ:
for(R_xlen_t i = 0 ; i < n ; i++)
if (x[i] != NA_INTEGER && x[i] > 0 && x[i] <= nb) y[x[i] - 1]++;
अब सारणीबद्ध के मुख्य भागों और मेरे Rcpp संस्करण बहुत करीब लगते हैं (मैं एनए के साथ काम कर परेशान नहीं है)।
प्रश्न 1: मेरा आरसीपीपी संस्करण 3 गुना धीमा क्यों है?
प्रश्न 2: मैं यह कहां जा सकता हूं कि यह समय कहां जाता है?
मुझे यह जानने की बहुत सराहना होगी कि समय कहां गया, लेकिन कोड को प्रोफ़ाइल करने का एक अच्छा तरीका भी बेहतर होगा। मेरे सी ++ कौशल केवल इतना ही हैं, लेकिन यह इतना आसान लगता है कि मुझे (मेरी उंगलियों को पार करना) किसी भी मूर्खतापूर्ण सामान से बचने में सक्षम रहा है जो मेरे समय को तीन गुना करेगा।
मेरे समय कोड:
max_x <- 100
xs <- sample(seq(max_x), size = 50000000, replace = TRUE)
system.time(getcts(xs, max_x))
system.time(tabulate(xs))
यह सारणीबद्ध के लिए getcts के लिए 0.318 और 0.126 देता है।
लेखन आर एक्सटेंशन मैनुअल में प्रोफाइलिंग के बारे में कुछ नोट हैं जो आपकी मदद कर सकते हैं। –