पेट्र Krampl का जवाब मेरी राय है, लेकिन अधिक की जरूरत में सबसे अच्छा छोरों की प्रकृति और कैसे प्रणाली के उपयोग का अनुकूलन करने के लिए के बारे में कहा जा रहा है । इस धागे पर होने वाले शुरुआती प्रश्न और मौजूदा उत्तरों में तार्किक और एल्गोरिदमिक त्रुटियों से और भ्रमित हो सकते हैं।
पहले, आइए देखते हैं कि आपके कोड के रूप में आप मूल रूप से यह लिखा है:
while True:
test = 0
if test == 5:
break
test = test - 1
आप एक पाश संदर्भ में कहते हैं while True
, सामान्य रूप से अपने इरादे हमेशा के पाश में रहने के लिए है। यदि यह आपका इरादा नहीं है, तो आपको लूप की संरचना के लिए अन्य विकल्पों पर विचार करना चाहिए। पेट्र क्रैम्पल ने आपको इसे संभालने का एक बिल्कुल सही तरीका दिखाया है जो आपके कोड को पढ़ने वाले किसी और के लिए अधिक स्पष्ट है। इसके अतिरिक्त, यह आपके लिए अधिक स्पष्ट होगा कि कई महीनों बाद आपको कुछ जोड़ने या ठीक करने के लिए अपने कोड पर फिर से जाना चाहिए। अच्छी तरह से लिखित कोड आपके दस्तावेज़ का हिस्सा है। चीजों को करने के लिए आमतौर पर कई तरीके होते हैं, लेकिन यह सभी संदर्भों में सभी तरीकों को समान रूप से मान्य नहीं करता है। while true
विशेष रूप से इस संदर्भ में इसका एक अच्छा उदाहरण है।
अगला, हम आपके मूल कोड में एल्गोरिदमिक त्रुटि देखेंगे। लूप में आप जो पहली चीज करते हैं वह 0 से test
असाइन की जाती है। आपके द्वारा की जाने वाली अगली चीज़ यह जांचना है कि test
का मान 5 है, जो तब तक मामला नहीं होगा जब तक कि आपके पास समान स्मृति स्थान को संशोधित करने वाले एकाधिक धागे न हों। थ्रेडिंग इस चर्चा के दायरे में नहीं है, लेकिन यह ध्यान देने योग्य है कि कोड तकनीकी रूप से काम कर सकता है, लेकिन कई धागे के साथ भी बहुत कुछ गायब होगा, उदा। सेमाफोर। वैसे भी, आप इस लूप में हमेशा इस तथ्य के बावजूद बैठेंगे कि सेंटीनल एक अनंत लूप को मजबूर कर रहा है।
कथन test = test - 1
बेकार के अगले पुनरावृत्ति की शुरुआत में वैरिएबल रीसेट होने पर यह बेकार है क्योंकि यह क्या करता है। यहां तक कि यदि आपने इसे test = 5
में बदल दिया है, तो लूप अभी भी अनंत होगा क्योंकि मान हर बार रीसेट होता है। यदि आप लूप के बाहर प्रारंभिक विवरण को स्थानांतरित करते हैं, तो कम से कम इसे बाहर निकलने का मौका मिलेगा।
test = 0
while True:
test = test - 1
if test == 5:
break
पाश में बयान के लिए अपने कार्यक्रम के तर्क पर निर्भर करता है: क्या आप का इरादा हो सकता है कुछ इस तरह था।यह किसी भी क्रम में काम करेगा, हालांकि, मुख्य बिंदु कौन सा है।
अगले अंक 0 पर शुरू, लगातार 1 घटाकर, और फिर एक सकारात्मक संख्या के साथ तुलना की क्षमता और संभावित तार्किक त्रुटि है। हाँ, वहाँ अवसरों जहां यह वास्तव में आप जब तक आप निहितार्थ समझते हैं करने का इरादा क्या हो सकता है, लेकिन इस सबसे तुम क्या नहीं इरादा संभावना है। अजगर के नए संस्करण के आसपास लपेट नहीं होगा जब आप सी और विभिन्न अन्य भाषाओं की तरह एक पूर्णांक की सीमा से निम्नतम तक पहुँचते हैं। यह आपको 1 घटाना जब तक आप अपने सिस्टम या कम से कम क्या आपके प्रक्रिया के लिए आवंटित है पर उपलब्ध स्मृति भर दिया जारी रखने के लिए अनुमति देता है। निम्न स्क्रिप्ट और परिणाम को देखो:
test = 0
while True:
test -= 1
if test % 100 == 0:
print "Test = %d" % test
if test == 5:
print "Test = 5"
break
जो इस निर्माण करता है:
Test = -100
Test = -200
Test = -300
Test = -400
...
Test = -21559000
Test = -21559100
Test = -21559200
Test = -21559300
...
test
का मूल्य 5 कभी नहीं होगा, तो यह पाश कभी नहीं बाहर हो जाएगा।
import time
test = 0
timeout = 300 # [seconds]
timeout_start = time.time()
while time.time() < timeout_start + timeout:
if test == 5:
break
test -= 1
यह अभी भी के आधार पर नहीं तोड़ देगा:
पेट्र Krampl के जवाब देने के लिए जोड़ने के लिए, यहाँ एक संस्करण शायद समय की एक निश्चित अवधि के बाद पाश बाहर निकलने के लिए क्या आप वास्तव में इसके अलावा में इरादा के करीब है कि है test
का मूल्य है, लेकिन यह एक उचित प्रारंभिक शर्त के साथ एक पूरी तरह से वैध पाश है। आगे की सीमा जांच आपको किसी भी कारण के लिए बहुत लंबे लूप के निष्पादन से बचने में मदद कर सकती है, उदा। जांच करें कि लूप एंट्री पर परीक्षण का मूल्य 5 से कम है, जो तुरंत लूप को तोड़ देगा।
एक अन्य बात का उल्लेख किया जाना चाहिए कि कोई अन्य उत्तर संबोधित नहीं किया गया है। कभी-कभी आप इस तरह पाश, तुम नहीं पूरे आवंटित समय के लिए CPU उपभोग करने के लिए चाहते हो सकता है जब। उदाहरण के लिए, कहें कि आप किसी दूसरे के मूल्य की जांच कर रहे हैं जो हर सेकेंड में बदल जाता है। यदि आप किसी प्रकार की देरी नहीं पेश करते हैं, तो आप अपनी प्रक्रिया में आवंटित प्रत्येक उपलब्ध सीपीयू चक्र का उपयोग करेंगे। यह जरूरी है कि यह आवश्यक है, लेकिन अच्छा डिज़ाइन उपलब्ध संसाधनों को ओवरबर्ड किए बिना आपके सिस्टम पर समानांतर में कई प्रोग्राम चलाने की अनुमति देगा। एक साधारण नींद का बयान आपकी प्रक्रिया में आवंटित सीपीयू चक्रों के विशाल बहुमत को मुक्त कर देगा ताकि अन्य कार्यक्रम काम कर सकें।
निम्नलिखित उदाहरण बहुत उपयोगी नहीं है, लेकिन यह अवधारणा का प्रदर्शन करता है। मान लें कि आप हर सेकेंड कुछ प्रिंट करना चाहते हैं। एक तरह से यह करने के लिए इस तरह होगा:
import time
tCurrent = time.time()
while True:
if time.time() >= tCurrent + 1:
print "Time = %d" % time.time()
tCurrent = time.time()
उत्पादन इस होगा:
Time = 1498226796
Time = 1498226797
Time = 1498226798
Time = 1498226799
और प्रक्रिया CPU उपयोग इस प्रकार दिखाई देगा:
है कि मूल रूप से कोई काम करने के लिए सीपीयू उपयोग की एक बड़ी मात्रा।इस कोड को बहुत प्रणाली के आराम करने के अच्छे है:
import time
tCurrent = time.time()
while True:
time.sleep(0.25) # sleep for 250 milliseconds
if time.time() >= tCurrent + 1:
print "Time = %d" % time.time()
tCurrent = time.time()
उत्पादन ही है:
Time = 1498226796
Time = 1498226797
Time = 1498226798
Time = 1498226799
और CPU उपयोग जिस तरह से, जिस तरह से कम है:
धन्यवाद इस काम करता है :) – Adilicious
'timeit.default_timer' है, जो हमेशा मंच के लिए सबसे सटीक घड़ी है मैं का उपयोग करें। विशेष रूप से, 'time.time' में केवल 1/60 एस ग्रैन्युलरिटी है, जो आपके पास बहुत कम समय समाप्ति होने पर पर्याप्त नहीं हो सकता है। पायथन 3 पर, 'time.monotonic',' time.perf_counter', और 'time.process_time' भी है, जो बेहतर हो सकता है (मैंने उनमें से किसी के साथ निपटा नहीं है)। – jpkotta
इस समाधान में प्रक्रिया करने के लिए बहुत सी शर्तें हैं। इसे अनुकूलित किया जाना चाहिए और 'जबकि True'' समय के साथ बदल दिया गया है। समय()