2012-06-20 5 views
5

मैं दूसरों के साथ एक पूर्णांक कुंजी और सूची मूल्यों के साथ एक शब्दकोश बना रहा हूं। इस शब्दकोश में मूल्य जोड़ना वास्तविक बाधा प्रतीत होता है हालांकि मैं सोच रहा था कि मेरे कोड को तेज़ करने का कोई तरीका हो सकता है या नहीं।पायथन: सूची मूल्यों के साथ शब्दकोश में जोड़ने का इष्टतम तरीका

class myClass(): 

    def __init__(self): 
    self.d = defaultdict(list) 

    def addValue(self, index, value): 
    self.d[index].append(value) 

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


मुझे पता चला है कि समस्या dict में नहीं है, लेकिन सूची संलग्न में (हालांकि मैं अपने मूल पोस्ट है, जिसके लिए मैं माफी माँगता हूँ में अन्यथा दावा किया)। यह समस्या पायथन के कचरा कलेक्टर में एक बग के कारण है, जिसे अच्छी तरह से this other question पर समझाया गया है। सभी मान जोड़ने से पहले जीसी को अक्षम करना और फिर इसे पुनः सक्षम करना, प्रक्रिया को तेज़ी से बढ़ाता है!

+2

किसी सूची में आइटम जोड़ना और किसी ऑब्जेक्ट या किसी ऑब्जेक्ट से मूल्य प्राप्त करना कोई समय नहीं लेता है। किसी प्रोग्राम को तेज़ी से बढ़ाने के लिए आपको प्रोफाइल के यादृच्छिक टुकड़ों को बदलकर प्रोफाइलिंग द्वारा बाधा मिलती है। –

+0

क्या मौजूदा कुंजी में आइटम्स को नए कुंजियों में मूल्य जोड़ने से काफी तेज है? –

+0

मुझे पता चला कि समस्या dict में नहीं है, लेकिन सूची में शामिल है (हालांकि मैंने अन्यथा मेरे मूल पोस्ट में दावा किया है, जिसके लिए मैं क्षमा चाहता हूं)। तब मुझे http://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressively-lower पर मेरे प्रश्न का उत्तर मिला। चूंकि मैं इस साइट पर नया हूं, मुझे नहीं पता कि इस मामले में मानक प्रक्रिया क्या है: क्या मुझे अपनी मूल पोस्ट को हटा देना चाहिए? या उपर्युक्त विवरण और पोस्ट का जवाब जोड़ें? – niefpaarschoenen

उत्तर

0

एक निष्कर्ष के रूप में मैं कह सकता हूं कि मूल प्रश्न में मेरा कोड सभी अन्य सुझावों के मुकाबले तेज या तेज है।

2

यह करने के लिए यह तुलना करें:

class myClass(): 

    def __init__(self): 
    self.d = {} 

    def addValue(self, index, value): 
    self.d.setdefault(index, []).append(value) 
+1

जिज्ञासा से, यह तेज़ क्यों है? मैंने सोचा होगा कि 'डिफॉल्टडिक्ट' दृश्यों के पीछे कुछ समान है। –

+1

एक संक्षिप्त परीक्षण के बाद मुझे पता चला कि यह तेज़ नहीं है। मुझे बस यह बेहतर पसंद है। – eumiro

+0

मुझे लगता है कि यह वास्तव में दृश्यों के पीछे समान है; समय किसी भी मामले में समान हैं ... हालांकि मैं डिफ़ॉल्ट डिफॉल्ट पसंद करता हूं, क्योंकि आम तौर पर आपको कम टाइप करना होगा। – niefpaarschoenen

1

वे कहते हैं कि "अनुमति के लिए की तुलना में माफी के लिए पूछने के बेहतर।"। अब आप व्यक्तिगत रूप से अनुमति मांग नहीं रहे हैं, लेकिन मैंने सोचा कि शायद defaultdict करता है, और यही वह धीमा हो रहा है।

try इस:

class myClass(): 

    def __init__(self): 
    self.d = {} 

    def addValue(self, index, value): 
    try: 
     self.d[index].append(value) 
    except KeyError: 
     self.d[index] = [value] 

इस शब्दकोश में index कुंजी का उपयोग करने की है, अगर यह मौजूद नहीं है यह एक KeyError बढ़ा देंगे, और उस पर कार्रवाई की कोशिश करता है।

क्या यह कोई तेज़ है?

+0

मैंने आपके कोड और कोड से प्रश्न से तुलना करने की कोशिश की है ([timeit] (http://docs.python.org/library/timeit.html) का उपयोग करके)। मैंने इस परीक्षण का उपयोग किया है: 'my = myClass() my.addValue (3, "ab") my.addValue (3, "cd") my.addValue (4, "ef") my.addValue (4, "जी") 'और मूल कोड तेज है! आपकी मशीन पर 24.66 यूकेसी आपके कोड के लिए और प्रश्न से कोड के लिए 18.10 usec। ऐसा लगता है कि यह दृष्टिकोण जवाब नहीं है .. – stalk

+1

लगता है कि आपके पास सबसे तेज़ समाधान है :) – jadkik94

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