2012-01-24 17 views
141

मैं हाल ही में पाइथन के लिए pandas लाइब्रेरी में आया, जो this benchmark के अनुसार बहुत तेज़ मेमोरी विलय करता है। आर (0 विश्लेषण के लिए पसंद की मेरी भाषा) में यह data.table पैकेज से भी तेज है।क्यों पंडे डेटा में टिकाऊ विलय से डेटा पाइथन में तेजी से विलय कर रहे हैं?

pandasdata.table से इतना तेज़ क्यों है? क्या यह एक अंतर्निहित गति लाभ पाइथन के कारण आर से अधिक है, या क्या कुछ ट्रेडऑफ है जिसके बारे में मुझे पता नहीं है? और merge(X, Y, all=TRUE) का उपयोग किए बिना data.table में आंतरिक और बाहरी जुड़ने का कोई तरीका है?

Comparison

यहाँ R code और Python code बेंचमार्क के लिए इस्तेमाल किया विभिन्न पैकेज है।

+0

मेरी परिकल्पना: क्योंकि data.table डेटा.फ्रेम और डेटा.फ्रेम पर आधारित है धीमा है। और मुझे लगता है कि अधिकांश पांडा मर्ज कोड साइथन में है। –

+10

@ जोशुआउलिच: आईआईआरसी 'data.table' सिर्फ 'data.frame' से विरासत में मिलता है, लेकिन यह हुड के नीचे सी-कोड पर निर्भर करता है। – digEmAll

+0

@digEmAll: डेटा.फ्रेम धीमे होते हैं भले ही आप उन्हें सी में हेरफेर करते हैं, लेकिन मैंने डेटा.table स्रोत को कभी नहीं देखा है। –

उत्तर

101

ऐसा लगता है कि वेस data.table में ज्ञात समस्या का पता लगा सकता है जब अद्वितीय तारों की संख्या (स्तर) बड़ी है: 10,000।

Rprof() कॉल sortedmatch(levels(i[[lc]]), levels(x[[rc]]) पर कॉल किए गए अधिकांश समय का खुलासा करता है? यह वास्तव में स्वयं शामिल नहीं है (एल्गोरिदम), लेकिन एक प्रारंभिक कदम है।

हाल के प्रयास कुंजी में वर्ण कॉलम की अनुमति देने में चले गए हैं, जो आर की अपनी वैश्विक स्ट्रिंग हैश तालिका के साथ अधिक बारीकी से एकीकृत करके उस समस्या को हल करना चाहिए। कुछ बेंचमार्क परिणामों को पहले से ही test.data.table() द्वारा रिपोर्ट किया गया है, लेकिन स्तर को स्तर के स्तर तक बदलने के लिए अभी तक यह कोड नहीं लगाया गया है।

क्या नियमित पूर्णांक कॉलम के लिए data.table से पांडा तेजी से विलीन हो जाते हैं? यह एल्गोरिदम स्वयं बनाम कारक मुद्दों को अलग करने का एक तरीका होना चाहिए।

इसके अलावा, data.tableसमय श्रृंखला दिमाग में विलय हो गई है। इसके दो पहलू: i) बहु कॉलम आदेश दिया गया कुंजी (आईडी, डेटाटाइम) ii) तेजी से प्रचलित शामिल (roll=TRUE) a.k.a. अंतिम अवलोकन आगे बढ़ाया गया।

मुझे पुष्टि करने के लिए कुछ समय चाहिए क्योंकि यह पहली बार मैंने देखा है कि data.table की तुलना में मैंने देखा है।data.table v1.8.0 से


अद्यतन जुलाई 2012

  • आंतरिक समारोह sortedmatch() हटा दिया और जब मैं प्रकार के स्तंभों के लिए एक्स स्तर तक के स्तर से मेल खाते chmatch() के साथ प्रतिस्थापित जारी किया 'कारक'। यह प्रारंभिक चरण एक (ज्ञात) महत्वपूर्ण मंदी पैदा कर रहा था जब कारक कॉलम के स्तर की संख्या बड़ी थी (उदा।> 10,000)। में ऐसे चार स्तंभों में शामिल होने के परीक्षण, जैसा कि वेस मैककिनी (पायथन पैकेज पांडस के लेखक) द्वारा दिखाया गया है। 0 मिलियन तारों का मिलान करना जिसमें से जिनमें से 600,000 अद्वितीय हैं, अब 16 से 0.5 तक कम हो गए हैं, उदाहरण के लिए।
कि रिलीज में

भी था:

  • चरित्र कॉलम अब चाबियाँ में अनुमति दी जाती है और कारक करने के लिए पसंद कर रहे हैं। data.table() और setkey() अब कारक पर कॉरर्स वर्ण नहीं है। कारक अभी भी समर्थित हैं। कार्यान्वयन FR # 1493, FR # 1224 और (आंशिक रूप से) FR # 951।

  • नए फ़ंक्शन chmatch() और% chin%, मिलान के तेज़ संस्करण() और वर्ण वैक्टर के लिए% में%। आर का आंतरिक स्ट्रिंग कैश उपयोग किया गया है (कोई हैश तालिका नहीं बनाई गई है)। उदाहरण के लिए वे chmatch में उदाहरण() से 4 गुना तेजी से हैं।

सितंबर 2013 तक डेटाटेबल सीआरएएन पर v1.8.10 है और हम v1.9.0 पर काम कर रहे हैं। NEWS लाइव अपडेट किया गया है।


लेकिन जैसा कि मैंने मूल रूप से लिखा था, इसके बाद के संस्करण:

data.table है समय श्रृंखला को ध्यान में मर्ज करें। इसके दो पहलू: i) बहु कॉलम आदेश दिया गया कुंजी (आईडी, डेटाटाइम) ii) तेजी से प्रचलित जुड़ें (roll=TRUE) a.k.a. अंतिम अवलोकन आगे बढ़ाया गया।

तो पांडा सम दो चरित्र स्तंभों की शामिल होने शायद अभी भी तेजी से data.table से है। चूंकि ऐसा लगता है जैसे यह संयुक्त दो कॉलम हैश करता है। data.table में कुंजी नहीं है क्योंकि यह प्रचलित आदेश में दिमाग में शामिल हो गया है। डेटाटेबल में एक "कुंजी" सचमुच सिर्फ क्रमबद्ध क्रम है (एसक्यूएल में क्लस्टर्ड इंडेक्स के समान; यानी, रैम में डेटा का ऑर्डर कैसे किया जाता है)। सूची में, माध्यमिक कुंजी जोड़ने के लिए है, उदाहरण के लिए।

संक्षेप में, 10,000 से अधिक अद्वितीय तारों के साथ इस विशेष दो-वर्ण-कॉलम परीक्षण द्वारा प्रकाश डाला गया चमकदार गति अंतर अब उतना बुरा नहीं होना चाहिए, क्योंकि ज्ञात समस्या ठीक हो गई है।

+4

हो सकता है यदि आप एक बड़े पैमाने पर, यथार्थवादी डेटा सेट के लिए एक परीक्षण केस प्रदान करते हैं, तो मुझे बेंचमार्क चलाने में खुशी होगी। आप भी स्वागत से अधिक हैं। मैंने वास्तव में अभी तक पूर्णांक में शामिल होने के लिए कोड को अनुकूलित नहीं किया है (मेरे टोडो सूची में डाल दिया है!), लेकिन आप लिंक किए गए प्रस्तुति में हैश टेबल अध्ययन के बाद स्ट्रिंग केस की तुलना में काफी बेहतर प्रदर्शन की उम्मीद कर सकते हैं। –

+17

मैं इन पुस्तकालयों में से किसी एक का उपयोग नहीं करता लेकिन मैथ्यू डॉउल के आकार में आर पक्ष से रचनात्मक प्रतिक्रिया देखने में प्रसन्न हूं। – SlowLearner

+2

यहां कुछ Rprof परिणाम http://pastie.org/3258362 हैं। ऐसा लगता है कि जुड़ने के प्रकार के आधार पर सॉर्टेडमैच में 20-40% समय बिताया जाता है। किसी अन्य समय पूर्णांक कॉलम को देखना होगा - मैंने उस मामले को अनुकूलित करने के लिए मुझे याद दिलाने के लिए एक पांडस गिटहब मुद्दा बनाया है (https://github.com/wesm/pandas/issues/682) –

186

कारण पांडा तेजी से होता है है, क्योंकि मैं गैर vectorizable भागों के लिए अजगर दुभाषिया भूमि के ऊपर से बचने के लिए एक बेहतर एल्गोरिथ्म, जो बहुत सावधानी से लागू किया गया है a fast hash table implementation - klib उपयोग करने के साथ और सी/Cython में आया। एल्गोरिदम को मेरी प्रस्तुति में कुछ विस्तार से वर्णित किया गया है: A look inside pandas design and development। क्योंकि आर के data.table के पूरे मुद्दे कि यह डेटा चयन और मर्ज के जैसे कार्य में तेजी लाने के पूर्व-परिकलित अनुक्रमित विभिन्न स्तंभों के लिए शामिल है

data.table के साथ तुलना वास्तव में थोड़ा दिलचस्प है। इस मामले में (डेटाबेस शामिल होता है) पांडा 'डेटाफ्रेम में कोई पूर्व-गणना की गई जानकारी है जिसका उपयोग विलय के लिए किया जा रहा है, इसलिए यह एक "ठंडा" विलय है। अगर मैंने जॉइन कुंजियों के कारक संस्करणों को संग्रहित किया था, तो शामिल होना काफी तेज़ होगा - क्योंकि इस एल्गोरिदम के लिए कारक बनाना सबसे बड़ी बाधा है।

मुझे यह भी जोड़ना चाहिए कि पांडा के डेटाफ्रेम का आंतरिक डिज़ाइन आर के डेटा.फ्रेम (जो आंतरिक रूप से सरणी की एक सूची है) की तुलना में इस तरह के संचालन के लिए अधिक अनुकूल है।

+71

बेशक, अब आपने इसे पाइथन में समझा है, इसे आर में अनुवाद करना आसान होना चाहिए;) – hadley

+36

लेकिन कोई भी कभी क्यों चाहेंगे? :) – ely

+9

उम्म ... शायद क्योंकि वे डेटा ऑपरेशन आर में तेजी से चाहते हैं? बस अनुमान लगाया :)) – lebatsnok

28

यह विषय दो साल का है, लेकिन जब लोग पांडों और डेटा की तुलना में खोज करते हैं तो लोगों के लिए एक संभावित जगह की तरह लगता है।तालिका

इन दोनों के बाद से समय के साथ विकसित किया है, मुझे कोई दिलचस्पी उपयोगकर्ताओं के लिए यहाँ (2014 से) एक अपेक्षाकृत नए तुलना पोस्ट करना चाहते हैं: https://github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping

यह जानना दिलचस्प हो सकता है अगर वेस और/या मैट (वैसे, वैसे, पांडों के निर्माता और डेटाटेबल क्रमशः हैं और दोनों ने ऊपर टिप्पणी की है) यहां भी जोड़ने के लिए कोई खबर है। https://github.com/szilard/benchm-databases

https://github.com/szilard/benchm-databases/blob/master/plot.png

यह ग्राफ एकत्रीकरण की औसत बार दर्शाया गया है और संचालन में शामिल होने:

- - अद्यतन

एक टिप्पणी jangorecki से नीचे तैनात एक कड़ी है कि मुझे लगता है कि होता है बहुत उपयोगी है विभिन्न तकनीकों के लिए (निचला = तेज़; तुलना पिछली बार सितंबर 2016 में अपडेट की गई)। यह वास्तव में मेरे लिए शैक्षिक था।

वापस सवाल, R DT key और R DT आर के data.table के बंद/unkeyed जायके का उल्लेख करने जा रहे हैं और तेजी से अजगर के पांडा (Py pandas) की तुलना में इस बेंचमार्क में होना होता है।

+1

मैं बस इसे पोस्ट करने वाला था! जोड़ने के लिए धन्यवाद। – Zach

+0

मुझे उम्मीद है कि कोई भी जल्द ही बेंचमार्क में शामिल होगा! – Zach

+6

@Zach इसे देखें: https://github.com/szilard/benchm- डेटाबेस और यह भी अच्छा है: https://speakerdeck.com/szilard/r-stories-from-the-trenches-budapest-r-meetup -aug 2015 – jangorecki

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

  • कोई संबंधित समस्या नहीं^_^