2011-03-30 20 views
5

मेरे पास कुछ पायथन स्क्रिप्ट हैं जहां मैं एक शब्दकोश में 5-10 मिलियन स्ट्रिंग कुंजी मान जोड़े संग्रहीत कर रहा हूं और मैं इस शब्दकोश को लगभग 5-10 मिलियन बार पूछता हूं। मैंने देखा कि पायथन dict बहुत अच्छा प्रदर्शन नहीं कर रहा है। स्ट्रिंग कुंजी के लिए सबसे अच्छा कोई अन्य कार्यान्वयन उपयुक्त है।पायथन: सर्वश्रेष्ठ शब्दकोश कार्यान्वयन

संपादित करें:

मैं उस व्यक्ति के नाम के दो बड़े सूचियों कर रहा हूँ और मैं उन्हें मिलान करना चाहते हैं, तो मैं संदर्भ सूची के रूप में उनमें से एक लेते हैं और यह पता लगाने की दूसरी सूची में प्रत्येक नाम पर अलग-अलग शोध प्रणालियों को लागू करने की कोशिश अगर वह पहली सूची में मौजूद है। इसलिए, मुझे दूसरी सूची में प्रत्येक नाम के लिए पहली बार 2-3 बार पूछताछ करना है। उम्मीद है, यह समझ में आता है।

+0

आप डेटाबेस का उपयोग क्यों नहीं कर रहे हैं? – Geo

+1

डाटाबेस कोई मतलब नहीं है। – Boolean

+1

मुझे विश्वास करना मुश्किल लगता है कि फिर शब्दकोश लुकअप बाधाएं हैं।पाइथन शब्दकोश तेज़ हैं, और ऐसे मामले के लिए अनुकूलन भी हैं जहां सभी चाबियाँ तार हैं। क्या आप निश्चित हैं कि 'विभिन्न हेरिस्टिक' लागू करने का समय नहीं लिया जा रहा है? क्या आपने शब्दकोश लुकअप के साथ और बिना बेंचमार्क किया है? – Duncan

उत्तर

1

वाह। एक हैशप (शब्दकोश) शायद वह संरचना हो जिसे आप ढूंढ रहे हैं।

तारों का उपयोग करने के बजाय, एक ऐसे प्रस्ताव का प्रयास करें जो आपको अच्छा और तेज़ हैशिंग दे सके। या आप वास्तव में तारों को संग्रहित कर रहे हैं? यदि ऐसा है, तो पिछले वाक्य में "शायद" scracth।

क्या आप हमें जिस समस्या का सामना कर रहे हैं, उसके बारे में विवरण दे सकते हैं?

+0

विवरण के साथ प्रश्न संपादित किया – Boolean

0

सैंटियागो लेज़िका ने कहा, एक शब्दकोश वह संरचना नहीं है जिसे आप ढूंढ रहे हैं।

शायद आपको रेडिस का प्रयास करना चाहिए: http://redis.io। यह एक उन्नत कुंजी-मूल्य स्टोर है।

पाइथन here के लिए एक लाइब्रेरी है।

0

पायटेबल्स http://www.pytables.org/moin यह बड़े डेटासेट स्टोर करने के लिए बनाया गया है। अपने मामले पर, एक शब्दकोश = एक तालिका

0
अपने विवरण से

यह लग रहा है जैसे आप के रूप में अच्छी तरह से कर सकते हैं:

set(names1).intersection(set(names2)) 

है न?

किसी भी तरह से, ऐसा लगता है कि समस्या यह है कि पाइथन के हैशटेबल्स के कार्यान्वयन के बजाय आपका एल्गोरिदम धीमा है।

0

कक्षाओं या विधि कॉल का उपयोग न करने पर भी, अपना कोड फ़ंक्शन में रखें और उस फ़ंक्शन को कॉल करें। पायथन के कार्यों को आंशिक रूप से अत्यधिक अनुकूलित किया जाता है क्योंकि यह वैश्विक चर से तेज़ स्थानीय चर का उपयोग करता है।

Python Performance Tips पायथन विकी पर लेखन इस विषय पर एक महान पढ़ा गया है।

1

प्रश्न: क्या यह एक स्केलिंग मुद्दा है? क्या आप पाते हैं कि कोड में दो गुना अधिक धीमा होता है जब आपके पास दो गुना अधिक डेटा होता है? क्या यह संभव है कि आप भौतिक स्मृति से बाहर हो रहे हैं और स्वैप मेमोरी का उपयोग कर रहे हैं?

प्रत्येक 100 वर्णों के 10 मिलियन तार एक गीगाबाइट है। यदि आपके पास 2 सेट हैं, तो यह 2 गीगाबाइट होगा, जो 32 बिट WinXP प्रक्रिया की सीमा के करीब है।

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

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