2011-08-21 18 views
7
के साथ धीमा

तो मैं एक छोटे से मुसीबत अजगर में लूप के लिए के साथ काम कर रही है - जहाँ तक मैं बता सकता हूँ, वे समय के साथ धीमी हो रही है। मैं एक सीमा के अंदर एक सीमा पर लूपिंग कर रहा हूं, और जैसे ही समय बीतता है, लूप ध्यान से धीमा हो जाता है। यह एक गेम इंजन के अंदर किया जाता है, अगर यह मायने रखता है। क्या कोई मुझे बता सकता है कि समस्या क्या है?अजगर लूप के लिए समय

यहां एक त्वरित उदाहरण है।

for x in range(xs): # xs, ys, and zs are all pre-determined size values 

    for z in range(zs): 

      for y in range(ys): 

       vp = [x * vs, y * vs, z * vs] 

       v = Cube(vp) 

इस प्रक्रिया की प्रारंभिक गति ठीक है, लेकिन समय के साथ पाश धीमा कर देती है। मुझे पता है कि यह गेम इंजन के रास्टरराइज़र की तरह कुछ और नहीं है क्योंकि जब लूप किया जाता है, तो शेष इंजन 60 एफपीएस पर चलता है। तो समस्या क्या हो सकती है?

संपादित करें: मैं अजगर 3 का उपयोग कर रहा है, तो कोई xrange है।

संपादित करें 2: इस उदाहरण के लिए, बनाम 1.0 है, और XS, वाईएस, और zs की पूर्व निर्धारित आकार मान सभी 20

+5

आपके तीन लूप पैरामीटर, एक्सएस, वाईएस, और जेड कितने बड़े हैं? –

+0

क्या होगा यदि आप लूप के अंदर दो लाइनों में से किसी एक को टिप्पणी करते हैं? – jtbandes

+0

यदि आप पाइथन 2.x 'xrange' का उपयोग कर रहे हैं तो' range' – GWW

उत्तर

13

हैं यह "अधिक जानकारी की जरूरत" का एक और मामला है।

from itertools import product 

for x, y, z in product(xrange(xs), xrange(zs), xrange(ys)): 
    vp = [x * vs, y * vs, z * vs] 
    v = Cube(vp) 

यह भीतरी पाश में range रों हर बार के निर्माण की आवश्यकता नहीं है: हालांकि, अजगर, इस कुशलता की तरह itertools.product नेस्टेड छोरों के निर्माण की एक मानक तरीका है। मैं भी xrange को range के आपके उपयोग बंद कर के रूप में यह बड़ी श्रेणियों के लिए बेहतर है, हालांकि यह वास्तव में product साथ अप्रासंगिक है।

@ JohnZ के सवाल अच्छा है - अगर आपकी "पूर्व निर्धारित आकार मान" बहुत बड़े हैं, और विशेष रूप से अगर vs भी बड़ी है, तो आप कुछ बड़े मूल्यों का निर्माण हो सकता है, और यह एक लंबे समय के Cube पर कार्रवाई करने के लिए ले जा सकता है उन्हें।

मैं पाश ही धीमा हो रहा है पर शक है, लेकिन संख्या बड़ी हो रही है, तो अपनी गणना हो सकता है।

+0

बनाम वास्तव में 1.0 है। – SolarLune

+0

इसके अलावा, मेरे 'पूर्वनिर्धारित आकार मान' इस उदाहरण के लिए 20 प्रत्येक हैं। – SolarLune

+0

लेकिन यह बात अजीब बात है - लूप के लिए स्थिर गति पर रहना चाहिए, है ना? यह निश्चित रूप से एक बिंदु पर समय के साथ धीमा हो रहा है ... – SolarLune

1

तीन बातें मैं के बारे में सोच सकते हैं:

मेमोरी - अगर आप उत्पन्न मूल्यों के सभी कहीं न कहीं भंडारण कर रहे हैं, पाश धीमा हो सकती है क्योंकि सभी स्मृति का उपयोग किया जा रहा। पायथन के पास इसका स्वयं का मेमोरी मैनेजर है, इसलिए बहुत सारी मेमोरी का उपयोग करके प्रोग्राम धीमा हो सकता है। गणना की

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

घन - यह घन कोड में एक बग हो सकता है (हालांकि मुझे यकीन है कि यह शायद बस के रूप में सरल रूप में यह लग रहा है कर रहा हूँ)।

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