2017-05-07 18 views
10

मैं वर्तमान में 2 मिलियन से अधिक लाइनों वाली फ़ाइल के साथ काम कर रहा हूं। मैंने लाइनों को तत्वों की सूचियों में विभाजित कर दिया है (उदा: [a,b,c,d] = 1 पंक्ति, शब्द अलग)। मैं 2 मिलियन + लाइनों का जिक्र कर रहा हूँपायथन लूप अनुकूलन

for a in aud: 
    for esps in final: 
     if a[0] in final[esps]: 
      a[0] = esps 

पाश के लिए पहले में:

मैं सभी लाइनों के माध्यम से जाने के लिए निम्न कोड का उपयोग करने की कोशिश कर रहा हूँ। लूप के लिए दूसरे में यह 2010 कुंजी के साथ एक शब्दकोश के माध्यम से जाता है, संभवतः कम से कम 50 संबंधित मानों के साथ प्रत्येक कुंजी। मैं a[0] तत्व को उन पंक्तियों में ढूंढना चाहता हूं जो शब्दकोश में मानों के बराबर हैं। यदि वे मेल खाते हैं, तो मैं चयनित लाइन में a[0] तत्व को शब्दकोश की कुंजी के मान में बदलता हूं।

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

+0

हम्म, तो आप सिर्फ एक कंप्यूटर तक ही सीमित कर रहे हैं? मुझे लगता है कि आप ऐसा करने के लिए कई श्रमिकों का उपयोग कर सकते हैं। एक कंप्यूटर के साथ भी, आप मल्टीकोर सीपीयू –

+0

के साथ कई श्रमिक भी बना सकते हैं, इस विवरण को किसी भी उदाहरण डेटा के साथ आपकी वास्तविक समस्या को कम करना मुश्किल है। क्या "अंतिम" शब्दकोश स्ट्रिंग में से प्रत्येक में 50 कुंजी हैं? – jsbueno

+0

क्या इस पर पुनरावृत्ति करते समय किसी ऑब्जेक्ट को म्यूट करने का दुष्प्रभाव नहीं होगा? – pylang

उत्तर

24

जब आपके पास "बड़ी" चीजें चलाने के लिए होती है, इस तरह, चीजों को तेजी से चलने की कुंजी "एल्गोरिदमिक जटिलता को कम करना" है - यानी, यदि संभव हो तो डेटा सेट के आकार पर निर्भर किसी भी ऑपरेशन से बचें ।

उदाहरण में आपने दिया है, आप अपनी लाखों लाइनों में से प्रत्येक के लिए 50 x 2000 रैखिक खोज - यह बहुत कुछ है! समस्या यह है कि यदि आपकी प्रत्येक final[esps] एक सूची है, तो पाइथन इन 50 मानों में एक रैखिक खोज करता है - ऑपरेटर in के साथ।

चूंकि आप उल्लेख करते हैं कि आप फ़ाइल से अपने मूल्य पढ़ रहे हैं, मुझे यह मानना ​​है कि final की पंक्तियों में तत्व दोनों हैं - लेकिन यह संख्याओं के लिए भी काम करेगा। एक set साथ in ऑपरेटर परिवर्तन से मैच रैखिक जा रहा है (ओ (एम से लगातार समय में होना करने के लिए से के लिए) -

एक पहले, बहुत ही सरल अनुकूलन, बस सूचियों से भी अपने final पंक्तियों शब्दकोश set रों में बदलने के लिए है हे (1)) - हां, तो आप मूल रूप से अपनी खोज को समय 50 का एक पहलू से कटौती करता है, तो अपने उदाहरण में कोड को चलाने से पहले आप करते हैं:

for key in final: 
    final[key] = set(final[key]) 

लेकिन आप अभी भी 2010 के प्रत्येक में एक रेखीय खोज प्रदर्शन कर रहे हैं final की चाबियाँ। निरंतर खोज में बदलने का तरीका एक उल्टा शब्दकोश बनाना है - जिसमें final की पंक्ति में 50 मानों में से प्रत्येक कुंजी esp पर इंगित करता है। फिर आप इस उल्टा शब्दकोश में कुंजी के रूप में एक [0] का उपयोग करें - और आप एक शब्दकोश में निरंतर समय में खोज के लिए 100000 आइटम (2000 x 50) में एक रैखिक खोज बदल रहे हैं;

कि पूरा करने के लिए आसान है - बस के लिए अपने कोड बदलने के लिए:

rfinal = {} 
for esp, values in final.items(): 
    for value in values: 
     rfinal[value] = esp 


for a in aud: 
    if a[0] in rfinal: 
     a[0] = rfinal[a[0]] 
    else: 
     # code for when there is no match for a[0] 
     ... 
+2

इस उदाहरण ने बस सबकुछ बदल दिया। खत्म होने के बिना 1 घंटे से अधिक ... केवल सेकंड तक। इससे बहुत मदद मिली! मेरे काम के साथ और समझने की दिशा में कि मैं भविष्य में कोड कैसे अनुकूलित कर सकता हूं। धन्यवाद 2 मिलियन + बार आह! – Targaryel

+0

यह लगभग 100 है।इस मामले में 000 गुना तेजी से :-) - यदि यह काम करता है, तो कृपया उत्तर को स्वीकृत के रूप में चिह्नित करना याद रखें। – jsbueno

+2

इस तरह की अनुकूलन समस्याओं का अभ्यास करने के लिए एक अच्छी जगह https://projecteuler.net/ है – jsbueno

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