दिलचस्प पोस्ट
UITextField के लिए टेक्स्ट इनसेट? मैं SSL फ़ॉलबैक कैसे अक्षम कर सकता हूँ और .NET में आउटबाउंड कनेक्शन के लिए केवल TLS का उपयोग कैसे करूं? (पूडल शमन) IntelliJ IDEA में बाहरी पुस्तकालय कैसे जोड़ें? सूचकांक की परवाह किए बिना हमेशा पिछली पंक्ति डिफ़ॉल्ट टेलिबल मॉडेल से हटा दी गई थी दशमलव स्पीड डबल बनाम Jquery में लिपियों की तरह बाहरी सीएसएस फाइल लोड करें जो कि या तो में भी संगत है I एक से अधिक सीएसएस / जेएस फ़ाइलों को जोड़ना और जोड़ना एकाधिक पैरामीटर को mysqli क्वेरी में बाँधें FileNameExtensionFilter के साथ File.listFiles का उपयोग करना जावा: संदर्भ से int पास करने का सर्वोत्तम तरीका node.js 'console.log अतुल्यकालिक है? मैं पायथन में रॉ सॉकेट का उपयोग कैसे करूं? ब्लॉक स्कोप मूल रूप से जावास्क्रिप्ट में लागू क्यों नहीं किया गया था? कैसे दो "एआर" स्थैतिक पुस्तकालयों को एक में मर्ज करने के लिए कार्यपत्रक को अपडेट करने के लिए Excel में यूडीएफ का उपयोग करना

क्या आप हमेशा श्रेणी () पर एक्सरेन्ज () को पसंद करते हैं?

क्यों या क्यों नहीं?

वेब के समाधान से एकत्रित समाधान "क्या आप हमेशा श्रेणी () पर एक्सरेन्ज () को पसंद करते हैं?"

प्रदर्शन के लिए, खासकर जब आप एक बड़ी रेंज पर फिर से चल रहे हैं, तो xrange() आमतौर पर बेहतर है हालांकि, अभी भी कुछ मामलों में आप range() क्यों पसंद कर सकते हैं:

  • अजगर 3 में, range() करता है जो xrange() करता है और xrange() मौजूद नहीं है यदि आप कोड लिखना चाहते हैं जो पायथन 2 और पायथन 3 दोनों पर चलेंगे, तो आप xrange() उपयोग नहीं कर सकते।

  • range() वास्तव में कुछ मामलों में तेजी से हो सकता है – जैसे यदि एक ही अनुक्रम पर बार-बार फिर से चलना xrange() को हर बार पूर्णांक ऑब्जेक्ट को फिर से बनाना पड़ता है, लेकिन range() में वास्तविक पूर्णांक ऑब्जेक्ट्स होंगे (यह हमेशा मेमोरी के संदर्भ में भी बदतर प्रदर्शन करेगा)

  • सभी मामलों में xrange() उपयोगी नहीं है जहां एक वास्तविक सूची की आवश्यकता है। उदाहरण के लिए, यह स्लाइस, या किसी भी सूची विधियों का समर्थन नहीं करता।

[संपादित करें] 2to3 उपकरण द्वारा range() को कैसे अपग्रेड किया जाएगा इसका उल्लेख करते हुए कुछ पोस्ट हैं रिकॉर्ड के लिए, यहां range() और xrange() कुछ नमूना उपयोगों पर उपकरण चलाने का उत्पादन होता है

 RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: ws_comma --- range_test.py (original) +++ range_test.py (refactored) @@ -1,7 +1,7 @@ for x in range(20): - a=range(20) + a=list(range(20)) b=list(range(20)) c=[x for x in range(20)] d=(x for x in range(20)) - e=xrange(20) + e=range(20) 

जैसा कि आप देख सकते हैं, जब लूप या समझ के लिए इस्तेमाल किया जाता है, या जहां पहले से सूची () के साथ लिपटे हुई है, तो रेंज अपरिवर्तित बनी हुई है

नहीं, वे दोनों का उपयोग करते हैं:

xrange() प्रयोग करें जब फिर से xrange() , क्योंकि यह स्मृति को बचाता है कहते हैं:

 for x in xrange(1, one_zillion): 

बजाय:

 for x in range(1, one_zillion): 

दूसरी ओर, range() उपयोग करें range() यदि आप वास्तव में संख्याओं की एक सूची चाहते हैं

 multiples_of_seven = range(7,100,7) print "Multiples of seven < 100: ", multiples_of_seven 

जब आपको वास्तविक सूची की आवश्यकता होती है, तब आपको xrange() range() से अधिक range() लेना चाहिए उदाहरण के लिए, जब आप range() द्वारा दी गई सूची को संशोधित करना चाहते हैं, या जब आप इसे टुकड़ा करना चाहते हैं पुनरावृत्ति या यहां तक ​​कि सामान्य xrange() , xrange() ठीक काम करेगा (और आमतौर पर अधिक कुशलतापूर्वक) एक ऐसा बिंदु है जहां range() बहुत छोटी सूचियों के लिए xrange() से थोड़ी अधिक तेज है, लेकिन आपके हार्डवेयर और अन्य विभिन्न विवरणों के आधार पर ब्रेक-भी लंबाई 1 या 2 के परिणामस्वरूप हो सकता है; कुछ के बारे में चिंता करने के लिए नहीं xrange() प्राथमिकता xrange()

एक अन्य अंतर यह है कि xrange () सी ints से बड़ा संख्याओं का समर्थन नहीं कर सकता है, इसलिए यदि आप बड़ी संख्या में समर्थन में अजगर का उपयोग कर एक श्रेणी चाहते हैं, तो आपको रेंज का उपयोग करना होगा ()

 Python 2.7.3 (default, Jul 13 2012, 22:29:01) [GCC 4.7.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> range(123456787676676767676676,123456787676676767676679) [123456787676676767676676L, 123456787676676767676677L, 123456787676676767676678L] >>> xrange(123456787676676767676676,123456787676676767676679) Traceback (most recent call last): File "<stdin>", line 1, in <module> OverflowError: Python int too large to convert to C long 

पायथन 3 में यह समस्या नहीं है:

 Python 3.2.3 (default, Jul 14 2012, 01:01:48) [GCC 4.7.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> range(123456787676676767676676,123456787676676767676679) range(123456787676676767676676, 123456787676676767676679) 

xrange() अधिक कुशल है क्योंकि वस्तुओं की एक सूची बनाने के बजाय, यह केवल एक ऑब्जेक्ट एक समय में उत्पन्न करता है इसके बजाय 100 पूर्णांक और अपने सभी उपरि, और सूची में डाल देने के बजाय, आपके पास एक समय में एक पूर्णांक है तेज पीढ़ी, बेहतर स्मृति का उपयोग, अधिक कुशल कोड

जब तक मुझे विशेष रूप से कुछ के लिए एक सूची की ज़रूरत नहीं होती, तब तक मैं हमेशा xrange()

श्रेणी () एक सूची देता है, xrange () एक xrange ऑब्जेक्ट देता है

एक्सरेन्ज () थोड़ी तेज़ी से है, और थोड़ा अधिक मेमोरी कुशल है। लेकिन लाभ बहुत बड़ा नहीं है।

सूची द्वारा इस्तेमाल की जाने वाली अतिरिक्त मेमोरी निश्चित रूप से बर्बाद नहीं होती है, सूची में अधिक कार्यक्षमता (टुकड़ा, दोहराने, डालें, …) है। दस्तावेजों में सटीक मतभेद पाया जा सकता है। कोई निस्तारहीन नियम नहीं है, जो आवश्यक है उसका उपयोग करें।

पायथन 3.0 अभी भी विकास में है, लेकिन IIRC रेंज () 2.X के एक्सरेन्ज () के समान होगी और सूची (श्रेणी ()) को सूची उत्पन्न करने के लिए उपयोग किया जा सकता है।

मैं सिर्फ यह कहना चाहूंगा कि यह वास्तव में मुश्किल नहीं है कि किसी एक्सरेन्ज ऑब्जेक्ट को स्लाइस और इंडेक्सिंग फंक्शंस के साथ मिलें। मैंने कुछ कोड लिखा है जो बहुत डांग अच्छी तरह से काम करता है और जितना तेज़ होने के लिए एक्सरेेंज के रूप में तेजी से होता है (पुनरावृत्तियों)

 from __future__ import division def read_xrange(xrange_object): # returns the xrange object's start, stop, and step start = xrange_object[0] if len(xrange_object) > 1: step = xrange_object[1] - xrange_object[0] else: step = 1 stop = xrange_object[-1] + step return start, stop, step class Xrange(object): ''' creates an xrange-like object that supports slicing and indexing. ex: a = Xrange(20) a.index(10) will work Also a[:5] will return another Xrange object with the specified attributes Also allows for the conversion from an existing xrange object ''' def __init__(self, *inputs): # allow inputs of xrange objects if len(inputs) == 1: test, = inputs if type(test) == xrange: self.xrange = test self.start, self.stop, self.step = read_xrange(test) return # or create one from start, stop, step self.start, self.step = 0, None if len(inputs) == 1: self.stop, = inputs elif len(inputs) == 2: self.start, self.stop = inputs elif len(inputs) == 3: self.start, self.stop, self.step = inputs else: raise ValueError(inputs) self.xrange = xrange(self.start, self.stop, self.step) def __iter__(self): return iter(self.xrange) def __getitem__(self, item): if type(item) is int: if item < 0: item += len(self) return self.xrange[item] if type(item) is slice: # get the indexes, and then convert to the number start, stop, step = item.start, item.stop, item.step start = start if start != None else 0 # convert start = None to start = 0 if start < 0: start += start start = self[start] if start < 0: raise IndexError(item) step = (self.step if self.step != None else 1) * (step if step != None else 1) stop = stop if stop is not None else self.xrange[-1] if stop < 0: stop += stop stop = self[stop] stop = stop if stop > self.stop: raise IndexError if start < self.start: raise IndexError return Xrange(start, stop, step) def index(self, value): error = ValueError('object.index({0}): {0} not in object'.format(value)) index = (value - self.start)/self.step if index % 1 != 0: raise error index = int(index) try: self.xrange[index] except (IndexError, TypeError): raise error return index def __len__(self): return len(self.xrange) 

ईमानदारी से, मुझे लगता है कि यह पूरी तरह से मूर्खतापूर्ण है और ज़ोरांगे को यह सब कुछ भी करना चाहिए …

पुस्तक में दिया गया एक अच्छा उदाहरण: मैग्नस लाइ हेटलैंड द्वारा प्रैक्टिकल पायथन

 >>> zip(range(5), xrange(100000000)) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] 

मैं पूर्ववर्ती उदाहरण में एक्सरेन्ज के बजाय श्रेणी का उपयोग करने की अनुशंसा नहीं करेगा- हालांकि केवल पहले पांच नंबर की आवश्यकता होती है, सभी संख्याओं की गणना की जाती है, और इसमें बहुत समय लग सकता है एक्सरेन्ज के साथ, यह कोई समस्या नहीं है क्योंकि यह केवल उन संख्याओं की गणना करता है जिनकी ज़रूरत होती है

हां, मैं ब्रायन के उत्तर को पढ़ता हूं: अजगर 3 में, रेंज () एक जनरेटर है और एक्सरेन्ज () मौजूद नहीं है।

इन कारणों के लिए सीमा के साथ जाओ:

1) एक्सरेेंज नए पायथन संस्करणों में दूर जा रहा होगा। यह आपको आसानी से भविष्य अनुकूलता देता है

2) रेंज एक्सरेन्ज से जुड़ी क्षमता को लेकर होगी।

ठीक है, हर कोई यहां एक्सरेन्ज बनाम रेंज के व्यापारिक और फायदे के रूप में एक अलग राय है। वे ज्यादातर सही हैं, एक्सरेन्ज एक इटरेटर है, और रेंज फ़्लेस आउट करती है और वास्तविक सूची बनाता है। अधिकांश मामलों के लिए, आप वास्तव में दोनों के बीच अंतर नहीं देखेंगे। (आप सीमा के साथ नक्शा का उपयोग कर सकते हैं, लेकिन एक्सरेंज के साथ नहीं, लेकिन यह अधिक मेमोरी का उपयोग करता है।)

मुझे लगता है कि आप रैली को सुनना चाहते हैं, हालांकि, यह है कि पसंदीदा विकल्प एक्सरेन्ज है चूंकि पायथन 3 में रेंज एक इटरेटर है, कोड कनवर्ज़न टूल 2to3 सही ढंग से एक्सरेन्ज के सभी उपयोगों को रेंज में कनवर्ट करेगा, और रेंज के उपयोग के लिए एक त्रुटि या चेतावनी फेंक देगा। यदि आप भविष्य में अपने कोड को आसानी से कनवर्ट करना सुनिश्चित करना चाहते हैं, तो आप केवल एक्सरेन्ज का उपयोग करेंगे, और सूची में (एक्सरेन्ज) सुनिश्चित कर लें कि आप एक सूची चाहते हैं। मैं शिकागो में इस साल (2008) PyCon पर CPython स्प्रिंट के दौरान यह सीखा।

  • range() : range(1, 10) 1 से 10 नंबरों की सूची लौटाती है और पूरी सूची मेमोरी में रखती है।
  • xrange() : range() , लेकिन एक सूची लौटने के बजाय, एक ऑब्जेक्ट रिटर्न करता है जो मांग पर रेंज में नंबर बनाता है। पाशन के लिए, यह range() से अधिक हल्का तेज है और अधिक मेमोरी कुशल है। xrange() एक इटरेटर की तरह वस्तु है और मांग पर संख्या (आलसी मूल्यांकन) उत्पन्न करता है।
 In [1]: range(1,10) Out[1]: [1, 2, 3, 4, 5, 6, 7, 8, 9] In [2]: xrange(10) Out[2]: xrange(10) In [3]: print xrange.__doc__ Out[3]: xrange([start,] stop[, step]) -> xrange object 

range() xrange() को अजगर 3 में करने के लिए इस्तेमाल की जाने वाली एक ही चीज़ करता है और पायथन 3 में मौजूद xrange() शब्द नहीं है। यदि आप एक ही अनुक्रम पर एकाधिक बार चलते हैं तो range() वास्तव में कुछ परिदृश्य में तेज हो सकती है। xrange() को हर बार पूर्णांक ऑब्जेक्ट को फिर से बनाना पड़ता है, लेकिन range() में वास्तविक पूर्णांक ऑब्जेक्ट्स होंगे

ज्यादातर परिस्थितियों में xrange range तुलना में तेज है, जबकि प्रदर्शन में अंतर बहुत कम है नीचे का छोटा सा कार्यक्रम range और एक xrange से तुलना xrange :

 import timeit # Try various list sizes. for list_len in [1, 10, 100, 1000, 10000, 100000, 1000000]: # Time doing a range and an xrange. rtime = timeit.timeit('a=0;\nfor n in range(%d): a += n'%list_len, number=1000) xrtime = timeit.timeit('a=0;\nfor n in xrange(%d): a += n'%list_len, number=1000) # Print the result print "Loop list of len %d: range=%.4f, xrange=%.4f"%(list_len, rtime, xrtime) 

नीचे दिए गए परिणाम दिखाते हैं कि xrange वास्तव में तेज़ है, लेकिन पसीने के लिए पर्याप्त नहीं है।

 Loop list of len 1: range=0.0003, xrange=0.0003 Loop list of len 10: range=0.0013, xrange=0.0011 Loop list of len 100: range=0.0068, xrange=0.0034 Loop list of len 1000: range=0.0609, xrange=0.0438 Loop list of len 10000: range=0.5527, xrange=0.5266 Loop list of len 100000: range=10.1666, xrange=7.8481 Loop list of len 1000000: range=168.3425, xrange=155.8719 

तो सभी तरीकों से xrange का उपयोग xrange , लेकिन जब तक आप विवश हार्डवेयर पर न हों, इसके बारे में ज्यादा चिंता न करें।