2012 में आर में डेटाटेबल मर्जों की तुलना में पांडा को अजगर में तेजी से विलय क्यों किया गया?


160

मैं हाल ही में अजगर के लिए पांडा पुस्तकालय में आया था , जो इस बेंचमार्क के अनुसार बहुत तेजी से इन-मेमोरी मर्ज करता है। यह R में डेटाटेबल पैकेज से भी तेज है (विश्लेषण के लिए मेरी पसंद की भाषा)।

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

तुलना

यहाँ R कोड और पायथन कोड का उपयोग विभिन्न पैकेजों को बेंचमार्क करने के लिए किया जाता है।


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

4
@ जोशुआ "क्या मतलब है" डेटा.फ्रेम धीमी हैं भले ही आप उन्हें सी में हेरफेर करते हैं? क्या वह किसी और चीज के सापेक्ष है? और धीमी गति से क्या?
मैट डोले

12
@JoshuaUlrich मैंने अभी देखा इस टिप्पणी निशान को कभी बिस्तर पर नहीं रखा गया था। इसलिए इसे साफ करने के लिए: इस चर्चा के तुरंत बाद set()जोड़ा गया data.table। बहुत समान है, :=लेकिन [.data.tableजब लूप किया जाता है तो छोटे ओवरहेड से बचा जाता है और फलस्वरूप उतनी ही तेजी से होता है matrix। इसलिए, मैट्रिक्स के रूप में बस के रूप में तेजी से हेरफेर किया data.frame जा सकता है। बेंचमार्क यहाँ है
मैट डोवेल

5
क्या हम इस बेंचमार्क का अपडेटेड संस्करण प्राप्त कर सकते हैं, यह बहुत स्पष्ट है कि यह बेंच वास्तव में एक किनारे का मामला था और यह अब तक तय हो गया है। यह देखते हुए कि सभी बेंचमार्क मैंने देखे हैं कि data.table तेज है मैं देखना चाहता हूं कि मर्ज संख्या क्या है?
स्टेटकैंट

3
@statquant मैंने मूल बेंचमार्क नहीं चलाया, लेकिन मैं वास्तव में वेस को बेंचमार्क अपडेट करना पसंद करूंगा।
Zach

जवाबों:


120

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

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

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

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

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

मुझे यह पुष्टि करने के लिए कुछ समय की आवश्यकता होगी क्योंकि यह पहली बार है जब मैंने data.tableप्रस्तुत की तुलना में देखा है ।


जुलाई 2012 को जारी डेटाटेबल v1.8.0 से अद्यतन

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

उस रिलीज में भी था:

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

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

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


लेकिन जैसा कि मैंने मूल रूप से, ऊपर लिखा था:

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

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

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


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

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

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

14
@AndyHayden सुधार कुछ समय पहले किए गए थे। मैं समाचार आइटम में संपादित करूँगा। वेस ने एक विशिष्ट परीक्षण (दो वर्ण स्तंभों में शामिल होने वाले समान) को चुना जो उस ज्ञात समस्या पर खेला गया था। यदि वह पूर्णांक कॉलम उठाता तो यह अलग होता। और अगर उन्होंने सम्मेलन में बेंचमार्क प्रस्तुत करने से पहले मुझे एक सिर दिया, तो मैं उन्हें ज्ञात समस्या के बारे में अधिक बता सकता था।
मैट डोवेल

191

कारण पांडा तेजी से होता है है, क्योंकि मैं एक बेहतर एल्गोरिथ्म, जो बहुत सावधानी से लागू किया जाता है का उपयोग कर के साथ आया एक तेजी से हैश तालिका कार्यान्वयन - klib और सी / में Cython गैर vectorizable भागों के लिए भूमि के ऊपर अजगर दुभाषिया से बचने के लिए। एल्गोरिथ्म को मेरी प्रस्तुति में कुछ विस्तार से वर्णित किया गया है: पंडों के डिजाइन और विकास के अंदर एक नज़र

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

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


76
बेशक, अब जब आपने अजगर में यह सब पता लगा लिया है, तो इसका अनुवाद R में करना आसान होना चाहिए;)
हैडली

37
लेकिन कोई कभी क्यों करना चाहेगा? :)
एली

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

28
हाय वेस-- ऐसा लगता है कि आपके परिणाम data.tableएक बग द्वारा संचालित प्राथमिक थे जो तब से तय किए गए हैं। आप अपने बेंचमार्क को फिर से चला सकते हैं और एक अद्यतन ब्लॉग पोस्ट लिख सकते हैं?
Zach

6
Zach सुनिश्चित करें कि आप इसकी जाँच करते हैं: github.com/Rdatatable/data.table/wiki/Benchmark-:-Grouping
Merik

37

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

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

यह जानना दिलचस्प होगा कि क्या वेस और / या मैट (जो, वैसे, क्रमशः पंडों और डेटा.table के निर्माता हैं और दोनों ने ऊपर टिप्पणी की है) के रूप में अच्छी तरह से यहाँ जोड़ने के लिए कोई खबर है।

-- अपडेट करें --

Jangorecki द्वारा नीचे पोस्ट की गई एक टिप्पणी में एक लिंक है जो मुझे लगता है कि बहुत उपयोगी है: https://github.com/szilard/benchm-dat डेटाबेस

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

इस ग्राफ में एकत्रीकरण के औसत समय को दर्शाया गया है और विभिन्न तकनीकों के संचालन में शामिल है ( कम = तेज ; सेप्ट 2016 में अंतिम अपडेट की तुलना)। यह वास्तव में मेरे लिए शैक्षिक था।

प्रश्न पर वापस जा रहे हैं, R DT keyऔर R DTआर के data.table के कुंजीकृत / अनवीक फ्लेवर का संदर्भ लें और पायथन के पंडों ( Py pandas) की तुलना में इस बेंचमार्क में अधिक तेज़ हो ।


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

7
@ इसे देखें: github.com/szilard/benchm-dat डेटाबेस और वह भी अच्छा है: स्पीकरडेक.com
szilard

1
@ एक चार साल बाद नए बेंचमार्क परिणाम आखिरकार आए, नीचे मेरा जवाब देखें।
जांगकोरकी

7

महान जवाब हैं, विशेष रूप से दोनों उपकरणों के लेखकों द्वारा किए गए हैं जिनके बारे में सवाल पूछते हैं। मैट के जवाब ने सवाल में दर्ज मामले की व्याख्या करते हुए कहा कि यह बग के कारण हुआ था, न कि मर्ज एल्गोरिथम। बग अगले दिन तय किया गया था, पहले से ही 7 साल से अधिक।

अपने जवाब में मैं डेटाटेबल और पंडों के लिए मर्जिंग ऑपरेशन के कुछ अद्यतित समय प्रदान करूंगा। ध्यान दें कि प्लायर और बेस आर मर्ज शामिल नहीं हैं।

मैं जो समय प्रस्तुत कर रहा हूं वह db- बेंचमार्क परियोजना से आ रहा है , एक निरंतर चलने वाला प्रतिलिपि प्रस्तुत करने योग्य बेंचमार्क है। यह टूल को हाल के संस्करणों में अपग्रेड करता है और बेंचमार्क स्क्रिप्ट को फिर से चलाता है। यह कई अन्य सॉफ्टवेयर समाधान चलाता है। यदि आप स्पार्क में रुचि रखते हैं, तो Dask और कुछ अन्य लोग लिंक की जाँच करना सुनिश्चित करें।


अभी तक ... (अभी भी लागू किया जाना है: एक और डेटा आकार और 5 और प्रश्न)

हम LHS तालिका के 2 विभिन्न डेटा आकारों का परीक्षण करते हैं।
उन डेटा आकारों में से प्रत्येक के लिए हम 5 अलग-अलग मर्ज प्रश्न चलाते हैं।

Q1: एलएचएस भीतरी RHS- में शामिल होने के छोटे पूर्णांक पर
Q2: भीतरी में शामिल होने के आरएचएस-मध्यम पूर्णांक पर एलएचएस
एलएचएस: Q3 बाहरी में शामिल होने के आरएचएस-मध्यम पूर्णांक पर
Q4: एलएचएस भीतरी में शामिल होने के आरएचएस-माध्यम पर कारक (स्पष्ट)
Q5: भीतरी एलएचएस में शामिल होने RHS- पूर्णांक पर बड़ा

आरएचएस तालिका 3 विभिन्न आकारों की है

  • LHS / 1e6 के आकार में छोटे अनुवाद
  • मध्यम LHS / 1e3 के आकार में अनुवाद करता है
  • एलएचएस के आकार का बड़ा अनुवाद

सभी मामलों में LHS और RHS के बीच लगभग 90% मिलान पंक्तियाँ हैं, और RHS ज्वाइनिंग कॉलम (कोई कार्टेशियन उत्पाद) में कोई डुप्लिकेट नहीं है।


अब के रूप में (2 नवंबर 2019 को रन)

पांडा 0.25.3 1
नवबंर 2019 पर जारी किया गया। डेटा 0.12.7 (92abb70) 2 नवंबर 2019 को जारी

एलएचएस के दो अलग-अलग डेटा आकारों के लिए समय नीचे सेकंड में हैं। कॉलम pd2dtजोड़ा जाता है फ़ील्ड भंडारण अनुपात कितनी बार पांडा डेटा की तुलना में धीमी है।

  • 0.5 जीबी एलएचएस डेटा
+-----------+--------------+----------+--------+
| question  |  data.table  |  pandas  |  pd2dt |
+-----------+--------------+----------+--------+
| q1        |        0.51  |    3.60  |      7 |
| q2        |        0.50  |    7.37  |     14 |
| q3        |        0.90  |    4.82  |      5 |
| q4        |        0.47  |    5.86  |     12 |
| q5        |        2.55  |   54.10  |     21 |
+-----------+--------------+----------+--------+
  • 5 जीबी एलएचएस डेटा
+-----------+--------------+----------+--------+
| question  |  data.table  |  pandas  |  pd2dt |
+-----------+--------------+----------+--------+
| q1        |        6.32  |    89.0  |     14 |
| q2        |        5.72  |   108.0  |     18 |
| q3        |       11.00  |    56.9  |      5 |
| q4        |        5.57  |    90.1  |     16 |
| q5        |       30.70  |   731.0  |     23 |
+-----------+--------------+----------+--------+

भविष्य से अपडेट के लिए धन्यवाद! क्या आप डेटाटेबल के आर बनाम पायथन कार्यान्वयन के लिए एक कॉलम जोड़ सकते हैं?
जाच

1
मुझे लगता है कि सिर्फ वेबसाइट पर जाना और इसे चेक करना अच्छा है, यहां तक ​​कि आर डीटी बनाम पांडा को देखने के लिए भी। और pyDT वास्तव में मूल प्रश्न का हिस्सा नहीं था।
जंगोरीकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.