পাইথন ২ এক্স এ রেঞ্জ এবং এক্সরেঞ্জ ফাংশনের মধ্যে পার্থক্য কী?


718

দৃশ্যত এক্সরেঞ্জ দ্রুততর তবে কেন এটি দ্রুত হয় তা সম্পর্কে আমার কোনও ধারণা নেই (এবং এখন পর্যন্ত উপাখ্যান ছাড়াও কোনও প্রমাণ নেই যে এটি দ্রুততর) বা এর বাইরে কী কী সম্পর্কে আলাদা?

for i in range(0, 20):
for i in xrange(0, 20):

উত্তর:


816

পাইথন ২.x এ:

  • rangeএকটি তালিকা তৈরি করে, তাই আপনি যদি range(1, 10000000)এটি করেন তবে 9999999উপাদানগুলির সাথে মেমরিতে একটি তালিকা তৈরি করে।

  • xrange অলসতার সাথে মূল্যায়ন করে এমন একটি সিকোয়েন্স অবজেক্ট।

পাইথন 3 এ পাইথনের rangeসমতুল্য কাজ করে xrangeএবং তালিকাটি পেতে আপনাকে ব্যবহার করতে হবে list(range(...))


65
এক্সরেঞ্জ হ'ল এনটিও হ'ল জেনারেটর তবে এটি অলসতার সাথে মূল্যায়ন করে এবং জেনারেটরের মতো কাজ করে।
বৈভব মিশ্র

47
xrange(x).__iter__()একটি জেনারেটর।
augustomen

34
কেন তারা রেঞ্জকে অলস করে না দিয়ে এক্সরেঞ্জ করেছে?
রব গ্রান্ট

22
@ রবার্টগ্র্যান্ট, তারা করেছে। পাইথন ৩. এ (পাইথন ২.x লাইনে তারা এটি করতে পারেনি, যেহেতু সমস্ত পরিবর্তনগুলি অবশ্যই পিছনের দিকে সামঞ্জস্যপূর্ণ হতে পারে))
পল ড্রপার

12
@ রতুল এর অর্থ প্রত্যেকটি iআরম্ভের পরিবর্তে চাহিদা অনুযায়ী মূল্যায়ন করা হয়।
অনিলল

223

পরিসীমা একটি তালিকা তৈরি করে, তাই আপনি যদি range(1, 10000000)এটি করেন তবে 9999999উপাদানগুলির সাথে মেমরিতে একটি তালিকা তৈরি করে।

xrange একটি জেনারেটর, সুতরাং এটি একটি সিকোয়েন্স অবজেক্ট যা অলসতার সাথে মূল্যায়ন করে।

এটি সত্য, তবে পাইথন 3 .range()এ পাইথন 2 দ্বারা প্রয়োগ করা হবে .xrange()। আপনার যদি আসলে তালিকাটি তৈরি করতে হয় তবে আপনার এটি করতে হবে:

list(range(1,100))

3
আমি দেখতে পাচ্ছি না যে পরিসর হিসাবে একটি বিশাল সমস্যা (বিদ্যমান অ্যাপ্লিকেশনগুলি ভেঙে ফেলার বিষয়ে) বেশিরভাগই ছিল "আই ইন রেঞ্জের (1, 10) হিসাবে লুপগুলিতে ইনডেক্স তৈরি করার জন্য:"
বেনজমিন অটিন

10
+1 এই উত্তরের জন্য ধন্যবাদ, এক্সরেঞ্জের সাথে পাইথন 3 প্রতিস্থাপনের পরিসীমা সম্পর্কে তথ্য খুব দরকারী। আমি আসলে কাউকে তার পরিবর্তে বা ব্যাপ্তি ব্যবহারের জন্য বলেছিলাম এবং তারা বলেছিল যে অজগর 3 তে এটি কোনও ব্যাপার নয়, তাই আমি গুগল আরও তথ্যের জন্য অনুসন্ধান করেছি এবং এই উত্তরটি প্রকাশিত হয়েছে :)
সার্ভো

xrangeজেনারেটর কল করতে ভুল কি ? এটি yieldবিবৃতি সম্বলিত একটি ফাংশন , এবং শব্দকোষ অনুসারে এই জাতীয় ফাংশনগুলিকে জেনারেটর বলা হয়।
শীতের আলো

@ উইন্টারলাইট, মনে করুন এটির জন্য সঠিক শব্দটি পুনরাবৃত্তকারী। জেনারেটর পাশাপাশি গ্রহণ করতে সক্ষম হওয়া উচিত।
ম্যাকসিনেক্স

112

মনে রাখবেন, timeitছোট ছোট স্নিপেটগুলির কোডগুলির মধ্যে কোনটি দ্রুত পরীক্ষা করার জন্য মডিউলটি ব্যবহার করুন !

$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop

ব্যক্তিগতভাবে, আমি সর্বদা ব্যবহার করি .range(), যদি না আমি সত্যিই বিশাল তালিকাগুলি নিয়ে কাজ করতাম - যেমন আপনি দেখতে পাচ্ছেন, সময় অনুসারে, মিলিয়ন এন্ট্রিগুলির তালিকার জন্য, অতিরিক্ত ওভারহেডটি কেবল 0.04 সেকেন্ডের হয়। এবং কোরি যেমন উল্লেখ করেছে, পাইথন 3.0 এ .xrange()চলে যাবে এবং .range()যাইহোক আপনাকে সুন্দর পুনরাবৃত্তি আচরণ দেবে।


12
সময়কালীন উদাহরণের জন্য +1। দ্রষ্টব্য: উইন্ডোজ সিএমডি চালানোর জন্য ডাবল উদ্ধৃতি ব্যবহার করা দরকার, অর্থাত "" সুতরাং কোডটি হবেpython -m timeit "for i in xrange(1000000):" " pass"
ডাঁটা

10
এক্সরেঞ্জের প্রধান সুবিধা হ'ল স্মৃতি, সময় নয়।
এন্ডোলিথ

3
ব্যবহারিক উত্তরের জন্য +1: বিশাল ব্যতীত ব্যাপ্তি ব্যবহার করুন । বিটিডব্লিউ এগুলি ধারণাগতভাবে অভিন্ন, সঠিক? অদ্ভুতভাবে কোনও উত্তর মেলেনি যে।
বব স্টেইন

6
যদি এক্সরেঞ্জ দ্রুত হয় এবং মেমরি হোগ না করে তবে কেন কখনও ব্যাপ্তি ব্যবহার করবে?
অস্টিন মোহর

8
আমি আপনার বক্তব্যের সাথে সাধারণভাবে একমত, তবে আপনার মূল্যায়নটি ভুল: the extra overhead is only 0.04 secondsএটি দেখার সঠিক উপায় নয়, (90.5-51.1)/51.1 = 1.771 times slowerসঠিক কারণ এটি জানায় যে এটি যদি আপনার প্রোগ্রামের মূল লুপ হয় তবে এটি সম্ভবত এটির বাধা দিতে পারে। যাইহোক, এটি যদি একটি ছোট অংশ হয় তবে 1.77x অনেক বেশি nt
chacham15

65

xrangeকেবলমাত্র পরিসীমা প্যারামগুলি সঞ্চয় করে এবং চাহিদা অনুযায়ী সংখ্যা উত্পন্ন করে। তবে পাইথনের সি বাস্তবায়নের ফলে বর্তমানে এটির লম্বাগুলি সি লংগুলিতে সীমাবদ্ধ রয়েছে:

xrange(2**32-1, 2**32+1)  # When long is 32 bits, OverflowError: Python int too large to convert to C long
range(2**32-1, 2**32+1)   # OK --> [4294967295L, 4294967296L]

দ্রষ্টব্য যে পাইথন 3.0 এ কেবল আছে rangeএবং এটি 2.x এর মতো আচরণ করে xrangeতবে সর্বনিম্ন এবং সর্বাধিক শেষের পয়েন্টগুলির সীমাবদ্ধতা ছাড়াই।


39

এক্সরেঞ্জ একটি পুনরাবৃত্তিকে রিটার্ন দেয় এবং একসাথে কেবল একটি সংখ্যা রাখে। পরিসীমা সংখ্যাগুলির পুরো তালিকা মেমরিতে রাখে।


9
xrangeএকটি পুনরাবৃত্তি প্রদান করে না
অবতারিত

and only keeps one number in memory at a timeএবং যেখানে বাকি রয়েছে তা দয়া করে আমাকে গাইড করুন ..
এসআইস্লাম

5
@ এসআইসলাম যদি এটি সূচনা, শেষ এবং বর্তমান সম্পর্কে জানে তবে এটি পরবর্তী সময়ে একবারে গণনা করতে পারে।
জাস্টিন মাইনার্স 15'17

30

লাইব্রেরি রেফারেন্সের সাথে কিছুটা সময় ব্যয় করবেন । আপনি এর সাথে যত বেশি পরিচিত, তত দ্রুত আপনি এই জাতীয় প্রশ্নের উত্তর পেতে পারেন। বিল্টিন অবজেক্ট এবং প্রকার সম্পর্কে প্রথম কয়েকটি অধ্যায় বিশেষত গুরুত্বপূর্ণ।

এক্সরেঞ্জ টাইপের সুবিধা হ'ল কোনও এক্সরেঞ্জ অবজেক্ট সর্বদা সম পরিমাণের মেমরি গ্রহণ করবে, এটি যে পরিমাণ আকারের প্রতিনিধিত্ব করে তা বিবেচনা করে না। কোনও সামঞ্জস্যপূর্ণ পারফরম্যান্স সুবিধা নেই।

পাইথন কন্সট্রাক্ট সম্পর্কে দ্রুত তথ্য সন্ধান করার আর একটি উপায় হ'ল ডকাস্ট্রিং এবং সহায়তা-কার্য:

print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)

1
পাঠাগারটি ভাল তবে আপনার কাছে থাকা প্রশ্নের উত্তর পাওয়া সর্বদা এত সহজ নয়।
টেফিয়ন

2
লাইব্রেরি রেফারেন্সে যান, সিটিআরএল + এফ চাপুন, ব্যাপ্তির সন্ধান করুন এবং আপনি দুটি ফলাফল পাবেন। এই প্রশ্নের উত্তর খুঁজতে খুব বেশি চেষ্টা করা হয়নি effort
ডেভিড লক

1
লাইব্রেরির রেফারেন্স কাজ করছে না। আপনি এটি আপডেট করতে পারেন?
এম কে ..

14

আমি হতবাক কেউ ডক না পড়ে :

এই ফাংশনটি খুব অনুরূপ range(), তবে xrangeতালিকার পরিবর্তে কোনও বস্তু প্রদান করে। এটি একটি অস্বচ্ছ ক্রম টাইপ যা একই তালিকায় একই সাথে সবগুলি সংরক্ষণ না করে সংশ্লিষ্ট তালিকার মতো একই মান দেয়। xrange()ওভারের সুবিধাটি range()ন্যূনতম (যেহেতু xrange()এখনও তাদের জিজ্ঞাসা করার সময় মানগুলি তৈরি করতে হবে) ব্যতীত যখন মেমরি-অনাহারে মেশিনে খুব বড় পরিসর ব্যবহৃত হয় বা যখন পরিসরের সমস্ত উপাদান কখনই ব্যবহার না করা হয় (যেমন লুপটি কখন থাকে) সাধারণত সাথে সমাপ্ত break)।


13

ব্যাপ্তি একটি তালিকা তৈরি করে, সুতরাং আপনি যদি পরিসীমাটি করেন (1, 10000000) এটি 10000000 উপাদানগুলির সাথে মেমরিতে একটি তালিকা তৈরি করে। এক্সরেঞ্জ একটি জেনারেটর, তাই এটি অলসতার সাথে মূল্যায়ন করে।

এটি আপনার জন্য দুটি সুবিধা নিয়ে আসে:

  1. আপনি একটি না পেয়ে দীর্ঘ তালিকা পুনরাবৃত্তি করতে পারেন MemoryError
  2. এটি প্রতিটি সংখ্যাটি অলসভাবে সমাধান করে, আপনি যদি তাড়াতাড়ি পুনরাবৃত্তি বন্ধ করেন, আপনি পুরো তালিকা তৈরি করতে সময় নষ্ট করবেন না।

12

আপনি এই সাধারণ উদাহরণে xrangeওভারের সুবিধা পাবেন range:

import timeit

t1 = timeit.default_timer()
a = 0
for i in xrange(1, 100000000):
    pass
t2 = timeit.default_timer()

print "time taken: ", (t2-t1)  # 4.49153590202 seconds

t1 = timeit.default_timer()
a = 0
for i in range(1, 100000000):
    pass
t2 = timeit.default_timer()

print "time taken: ", (t2-t1)  # 7.04547905922 seconds

উপরের উদাহরণটি ক্ষেত্রে উল্লেখযোগ্যভাবে ভাল কিছু প্রতিফলিত করে না xrange

এখন নীচের ক্ষেত্রে দেখুন যেখানে rangeতুলনা করা সত্যিই ধীর xrange

import timeit

t1 = timeit.default_timer()
a = 0
for i in xrange(1, 100000000):
    if i == 10000:
        break
t2 = timeit.default_timer()

print "time taken: ", (t2-t1)  # 0.000764846801758 seconds

t1 = timeit.default_timer()
a = 0
for i in range(1, 100000000):
    if i == 10000:
        break
t2 = timeit.default_timer() 

print "time taken: ", (t2-t1)  # 2.78506207466 seconds

এর সাথে range, এটি ইতিমধ্যে 0 থেকে 100000000 (সময় গ্রহণ) থেকে একটি তালিকা তৈরি করে, তবে xrangeএটি একটি জেনারেটর এবং এটি কেবল প্রয়োজনের ভিত্তিতে সংখ্যা তৈরি করে, যদি পুনরাবৃত্তিটি অব্যাহত থাকে।

পাইথন -৩-এ rangeকার্যকারিতা বাস্তবায়ন xrangeপাইথন -২ এর মতো, যখন তারা xrangeপাইথন -৩ এ সরিয়ে ফেলেছে

শুভ কোডিং !!


11

এটি অপ্টিমাইজেশনের কারণে।

পরিসর () শুরু থেকে শেষ পর্যন্ত মানগুলির একটি তালিকা তৈরি করবে (আপনার উদাহরণে 0 .. 20)। এটি খুব বড় পরিসরে একটি ব্যয়বহুল অপারেশনে পরিণত হবে।

অন্যদিকে xrange () আরও অনেক বেশি অনুকূলিত। এটি যখন প্রয়োজন হবে তখনই পরবর্তী মানটি গণনা করবে (এক্সরেঞ্জ সিকোয়েন্স অবজেক্টের মাধ্যমে) এবং রেঞ্জ () এর মতো সমস্ত মানের একটি তালিকা তৈরি করে না।


9

range(x,y)x এবং y এর মধ্যে প্রতিটি সংখ্যার একটি তালিকা প্রদান করে যদি আপনি একটি forলুপ ব্যবহার করেন তবে rangeধীর। আসলে, rangeএকটি বৃহত সূচক পরিসীমা আছে। range(x.y)x এবং y এর মধ্যে সমস্ত সংখ্যার একটি তালিকা মুদ্রণ করবে

xrange(x,y)ফিরে আসে xrange(x,y)তবে আপনি যদি একটি forলুপ ব্যবহার করেন তবে xrangeতা দ্রুত। xrangeএকটি ছোট সূচক পরিসীমা আছে। এটি xrangeকেবল মুদ্রণ করবে না xrange(x,y)তবে এটি এতে থাকা সমস্ত সংখ্যাও রক্ষা করবে।

[In] range(1,10)
[Out] [1, 2, 3, 4, 5, 6, 7, 8, 9]
[In] xrange(1,10)
[Out] xrange(1,10)

আপনি যদি একটি forলুপ ব্যবহার করেন , তবে এটি কাজ করবে

[In] for i in range(1,10):
        print i
[Out] 1
      2
      3
      4
      5
      6
      7
      8
      9
[In] for i in xrange(1,10):
         print i
[Out] 1
      2
      3
      4
      5
      6
      7
      8
      9

লুপগুলি ব্যবহার করার সময় খুব বেশি পার্থক্য নেই, যদিও এটি প্রিন্ট করার সময় কোনও তফাত রয়েছে!


8

রেঞ্জ (): রেঞ্জ (1, 10) 1 থেকে 10 নম্বর পর্যন্ত একটি তালিকা দেয় এবং মেমরিতে পুরো তালিকা ধরে রাখে।

এক্সরেঞ্জ (): রেঞ্জের মতো (), তবে একটি তালিকা ফেরতের পরিবর্তে, এমন একটি বস্তু প্রদান করে যা চাহিদা অনুসারে সীমাতে সংখ্যা তৈরি করে। লুপিংয়ের জন্য, এটি ব্যাপ্তির চেয়ে হালকা দ্রুত () এবং আরও মেমরি দক্ষ। এক্সরেঞ্জ () বস্তুটি একটি পুনরুক্তির মতো এবং চাহিদা অনুসারে সংখ্যা উত্পন্ন করে ((অলস মূল্যায়ন)

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__

xrange([start,] stop[, step]) -> xrange object

6

অন্যান্য উত্তরগুলির মধ্যে কয়েকটি উল্লেখ করে যে পাইথন 3 2.x গুলি মুছে ফেলে rangeএবং 2.x এর নাম পরিবর্তন xrangeকরে range। তবে, আপনি যদি না 3.0.০ বা ৩.১ ব্যবহার করেন (তবে কারওরকম হওয়া উচিত নয়), এটি আসলে কিছুটা আলাদা।

৩.১ ডক্স যেমন বলে:

ব্যাপ্তি অবজেক্টগুলির খুব সামান্য আচরণ থাকে: তারা কেবল ইনডেক্সিং, পুনরাবৃত্তি এবং lenফাংশনটিকে সমর্থন করে।

যাইহোক, 3.2+ এ, rangeএকটি সম্পূর্ণ অনুক্রম — এটি বর্ধিত টুকরো সমর্থন করে এবং এ collections.abc.Sequenceহিসাবে একই শব্দার্থবিজ্ঞানের সমস্ত পদ্ধতি list*

এবং, CPython এবং PyPy (শুধুমাত্র দুই 3.2+ বাস্তবায়নের যে বর্তমানে অস্তিত্ব) অন্তত, এটি লাগাতার টাইম বাস্তবায়নের হয়েছে indexএবং countপদ্ধতি ও inঅপারেটর (যতদিন না পর্যন্ত আপনি শুধু এটা পূর্ণসংখ্যার পাস হিসাবে)। এর অর্থ 123456 in rহল লিখনটি 3.2+ এ যুক্তিসঙ্গত, যখন ২.7 বা ৩.১ এ এটি একটি ভয়াবহ ধারণা হবে।


* যে issubclass(xrange, collections.Sequence)আয় True2.6-2.7 এবং 3.0-3.1 হয় একটি বাগ যে 3.2 সংশোধন করা হয় এবং ব্যাক-পোর্ট না।


6

পাইথন 2.x এ

পরিসর (এক্স) এক্স তালিকা সহ মেমোরিতে তৈরি করা একটি তালিকা দেয় created

>>> a = range(5)
>>> a
[0, 1, 2, 3, 4]

xrange (x) একটি এক্সরেঞ্জ অবজেক্ট প্রদান করে যা জেনারেটর অবজ যা চাহিদা অনুযায়ী সংখ্যা উত্পন্ন করে। তারা লুপ (অলস মূল্যায়ন) এর সময় গণনা করা হয়।

লুপিংয়ের জন্য, এটি ব্যাপ্তির চেয়ে সামান্য দ্রুত () এবং আরও মেমরি দক্ষ।

>>> b = xrange(5)
>>> b
xrange(5)

xrange()জেনারেটর নয়। xrange(n).__ ইটার __ () `হয়।
th3an0maly

5

লুপে এক্সরেঞ্জের বিরুদ্ধে পরিসীমা পরীক্ষা করার সময় (আমি জানি আমার সময়সীমা ব্যবহার করা উচিত , তবে এটি একটি সাধারণ তালিকা বোঝার উদাহরণ ব্যবহার করে স্মৃতি থেকে দ্রুত হ্যাক হয়েছিল) আমি নিম্নলিখিতটি পেয়েছি:

import time

for x in range(1, 10):

    t = time.time()
    [v*10 for v in range(1, 10000)]
    print "range:  %.4f" % ((time.time()-t)*100)

    t = time.time()
    [v*10 for v in xrange(1, 10000)]
    print "xrange: %.4f" % ((time.time()-t)*100)

যা দেয়:

$python range_tests.py
range:  0.4273
xrange: 0.3733
range:  0.3881
xrange: 0.3507
range:  0.3712
xrange: 0.3565
range:  0.4031
xrange: 0.3558
range:  0.3714
xrange: 0.3520
range:  0.3834
xrange: 0.3546
range:  0.3717
xrange: 0.3511
range:  0.3745
xrange: 0.3523
range:  0.3858
xrange: 0.3997 <- garbage collection?

বা, লুপের জন্য এক্সরেঞ্জ ব্যবহার করে:

range:  0.4172
xrange: 0.3701
range:  0.3840
xrange: 0.3547
range:  0.3830
xrange: 0.3862 <- garbage collection?
range:  0.4019
xrange: 0.3532
range:  0.3738
xrange: 0.3726
range:  0.3762
xrange: 0.3533
range:  0.3710
xrange: 0.3509
range:  0.3738
xrange: 0.3512
range:  0.3703
xrange: 0.3509

আমার স্নিপেট পরীক্ষা সঠিকভাবে হয়? এক্সরেঞ্জের ধীর উদাহরণে কোনও মন্তব্য? বা আরও ভাল উদাহরণ :-)


2
একসময় এই জাতীয় একটি মানদণ্ড চালানো সঠিক সময়সীমার ফলাফল সরবরাহ করে না। সর্বদা একটি বৈকল্পিকতা থাকে .. এটি জিসি, অথবা সিপিইউ চুরি করা অন্য কোনও প্রক্রিয়া হতে পারে ... যে কোনও কিছু। এজন্য বেনমার্কগুলি সাধারণত 10-100-1000 -... চালিত হয়
ওয়াজ হার্মেকজ

এটি কেবল তাড়াতাড়ি স্নিপেট প্রিন্টআউট - আমি এটি কয়েকবার চালিয়েছি, তবে কেবল প্রায় 100 টি পর্যন্ত, এবং xrangeকিছুটা দ্রুত বলে মনে হয়েছিল, যদিও পাইথন 3 এর সাথে তুলনাটি এখন অপ্রয়োজনীয়।
ডেভ এভারিট

3
এই কি timeitজন্য হয়। এটি অনেক সময় দৌড়াতে, জিসি অক্ষম করা, এর পরিবর্তে সেরা ঘড়ি ব্যবহার করা timeইত্যাদি যত্ন নেয়
May

4

পাইথনে এক্সরেঞ্জ () এবং ব্যাপ্তি () ব্যবহারকারীর জন্য একইভাবে কাজ করে, তবে পার্থক্য তখনই আসে যখন আমরা ফাংশন দুটি ব্যবহার করে কীভাবে মেমরি বরাদ্দ করা হয় তা নিয়ে কথা বলছি।

যখন আমরা ব্যাপ্তি () ব্যবহার করি তখন আমরা এটির উত্পন্ন করা সমস্ত ভেরিয়েবলগুলির জন্য মেমরি বরাদ্দ করি, তাই বৃহত্তর নম্বর সহ ব্যবহার করার পরামর্শ দেওয়া হয় না। ভেরিয়েবল উত্পন্ন করা হবে।

অন্যদিকে xrange () কেবল একবারে একটি নির্দিষ্ট মান উত্পন্ন করে এবং প্রয়োজনীয় সমস্ত মান মুদ্রণের জন্য লুপের সাহায্যে ব্যবহার করা যেতে পারে।


3

পরিসীমা পুরো তালিকা তৈরি করে এবং এটি প্রদান করে। xrange হয় না - এটি চাহিদার তালিকায় নম্বরগুলি উত্পন্ন করে।


2

এক্সরেঞ্জ একটি পুনরুক্তি ব্যবহার করে (ফ্লাইতে মান উত্পন্ন করে), পরিসীমা একটি তালিকা দেয়।


2

কি?
rangeরানটাইম স্থিতিশীল তালিকা ফেরত দেয়।
xrangeএমন কোনও ফেরত দেয় object(যা জেনারেটরের মতো কাজ করে, যদিও এটি অবশ্যই এক নয়) যা থেকে প্রয়োজন হিসাবে যখন মানগুলি উত্পন্ন হয়।

কখন ব্যবহার করবেন?

  • xrangeআপনি যদি একটি বিশাল ব্যাপ্তির জন্য একটি তালিকা তৈরি করতে চান তবে ব্যবহার করুন 1 বিলিয়ন, বিশেষত যখন আপনার কাছে একটি সেল ফোনের মতো "স্মৃতি সংবেদনশীল সিস্টেম" থাকে say
  • rangeআপনি তালিকার বেশ কয়েকবার পুনরাবৃত্তি করতে চাইলে ব্যবহার করুন ।

PS: পাইথন 3.x এর rangeফাংশন == পাইথন 2.x এর xrangeফাংশন।


xrangeজেনারেটর বস্তুটি ফেরত দেয় না।
অবতারিত

আমি যদি সঠিকভাবে বুঝতে পারি, তবে এখানে এটি ব্যাখ্যা করা হয়েছে (পাইথন ২.x এর জন্য): উইকি.পাইথন.আর.আমিন
কুমারীও ২৩

তাহলে উইকি ভুল হয়েছে is (আমি জানি না যে "এসএইচ" কে এই মন্তব্যটি যুক্ত এবং স্বাক্ষর করেছিলেন।) সরকারী ডকুমেন্টেশন সঠিক; আপনি নিজে এটি পরীক্ষা করে দেখতে পারেন এটি জেনারেটর বা সিকোয়েন্স কিনা।
অবতারিত

ঠিক আছে. কিন্তু এটি এখনও এই পড়ার পর মাথা খাচ্ছে stackoverflow.com/questions/135041/...
kmario23

1
মজাদার প্রশ্নটি হল যখন দোভাষী সরকারী দস্তাবেজগুলির সাথে, বা অন্য কোনও অনুবাদকের সাথে একমত নন… তবে ভাগ্যক্রমে, এটি খুব বেশি সময় আসে না ...
অ্যাবার্নার্ট

2

প্রত্যেকেই এটিকে ব্যাপকভাবে ব্যাখ্যা করেছে। তবে আমি এটি নিজের জন্য এটি দেখতে চেয়েছিলাম। আমি পাইথন 3 ব্যবহার করি। সুতরাং, আমি রিসোর্স মনিটরটি খুললাম (উইন্ডোজে!), এবং প্রথমে নিম্নলিখিত কমান্ডটি প্রথমে কার্যকর করেছি:

a=0
for i in range(1,100000):
    a=a+i

এবং তারপরে 'ব্যবহৃত' মেমরির পরিবর্তনটি চেক করে। এটা ছিল তুচ্ছ। তারপরে, আমি নিম্নলিখিত কোডটি চালিয়েছি:

for i in list(range(1,100000)):
    a=a+i

এবং এটি তাত্ক্ষণিকভাবে ব্যবহারের জন্য মেমরির একটি বড় অংশ নিয়েছে। এবং, আমি বিশ্বাসী ছিল। আপনি নিজের জন্য এটি চেষ্টা করতে পারেন।

আপনি যদি পাইথন 2 এক্স ব্যবহার করছেন তবে প্রথম কোডে 'রেঞ্জ ()' এবং 'তালিকা (রেঞ্জ ())' এর সাথে 'রেঞ্জ ()' দিয়ে 'কোড' ('রেঞ্জ') প্রতিস্থাপন করুন।


2

সহায়তা দস্তাবেজগুলি থেকে।

পাইথন 2.7.12

>>> print range.__doc__
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers

Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
These are exactly the valid indices for a list of 4 elements.

>>> print xrange.__doc__
xrange(stop) -> xrange object
xrange(start, stop[, step]) -> xrange object

Like range(), but instead of returning a list, returns an object that
generates the numbers in the range on demand.  For looping, this is 
slightly faster than range() and more memory efficient.

পাইথন ৩.৩.২

>>> print(range.__doc__)
range(stop) -> range object
range(start, stop[, step]) -> range object

Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).

>>> print(xrange.__doc__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined

পার্থক্য স্পষ্ট। পাইথন ২.x এ, rangeএকটি তালিকা দেয়, xrangeএকটি এক্সরেঞ্জ অবজেক্ট প্রদান করে যা পুনরাবৃত্তিযোগ্য।

পাইথন 3.x সালে rangeহয়ে xrangeপাইথন 2.x, এবং xrangeমুছে ফেলা হবে।


1

0-N আইটেমগুলির স্ক্যান / মুদ্রণের জন্য প্রয়োজনীয়তা অনুসারে, রেঞ্জ এবং এক্সরেঞ্জ নিম্নরূপে কাজ করে।

পরিসর () - মেমোরিতে একটি নতুন তালিকা তৈরি করে এবং পুরো 0 থেকে N আইটেমগুলিতে নেয় (সম্পূর্ণ এন + 1) এবং সেগুলি মুদ্রণ করে। এক্সরেঞ্জ () - একটি পুনরাবৃত্ত ইভেন্ট তৈরি করে যা আইটেমগুলির মাধ্যমে স্ক্যান করে এবং কেবলমাত্র বর্তমান মুখোমুখি আইটেমটিকে মেমরিতে রাখে, তাই সর্বদা একই পরিমাণ মেমরি ব্যবহার করে।

যদি তালিকার শুরুতে প্রয়োজনীয় উপাদানটি কিছুটা থাকে তবেই এটি সময় এবং মেমরির একটি ভাল পরিমাণ সঞ্চয় করে।


1
xrangeএকটি পুনরাবৃত্তি উদাহরণ তৈরি করে না। এটি একটি xrangeঅবজেক্ট তৈরি করে , যা পুনরাবৃত্তিযোগ্য, তবে কোনও পুনরুক্তিকারী নয় - প্রায় (তবে বেশ নয়) তালিকার মতো একটি ক্রম।
অবতারিত

1

রেঞ্জ একটি তালিকা দেয় যখন এক্সরেঞ্জ একটি এক্সরেঞ্জ অবজেক্ট ফেরত দেয় যা পরিসরের আকার নির্বিশেষে একই মেমরি গ্রহণ করে, যেমন এই ক্ষেত্রে কেবলমাত্র একটি উপাদান তৈরি করা হয় এবং পুনরাবৃত্তির জন্য উপলব্ধ হয় যখন ব্যাপ্তি ব্যবহারের ক্ষেত্রে সমস্ত উপাদান একবারে উত্পন্ন হয় এবং স্মৃতিতে উপলব্ধ।


1

পার্থক্যটি ছোট আর্গুমেন্টের কাছে range(..)/ xrange(..):

$ python -m timeit "for i in xrange(10111):" " for k in range(100):" "  pass"
10 loops, best of 3: 59.4 msec per loop

$ python -m timeit "for i in xrange(10111):" " for k in xrange(100):" "  pass"
10 loops, best of 3: 46.9 msec per loop

এই ক্ষেত্রে xrange(100)প্রায় 20% বেশি দক্ষ।


1

ব্যাপ্তি: -রেঞ্জ একবারে সমস্ত কিছুকে বসিয়ে দেবে means যার অর্থ পরিসীমাটির প্রতিটি সংখ্যা স্মৃতি দখল করবে।

এক্সরেঞ্জ: -রেঞ্জার জেনারেটরের মতো কিছু, যখন আপনি সংখ্যার ব্যাপ্তি চান এটি চিত্রে আসবে তবে আপনি চান না যে সেগুলি সংরক্ষণ করা হবে, আপনি যখন লুপ.সো মেমরির দক্ষতার জন্য ব্যবহার করতে চান তখন।


1

অতিরিক্তভাবে, যদি না হয় list(xrange(...))সমান হবে range(...)

তাই listধীর।

এছাড়াও xrangeসত্যই ক্রমটি সম্পূর্ণরূপে শেষ করে না

সুতরাং এটি কেন এটি একটি তালিকা নয়, এটি একটি xrangeবস্তু


1

range() পাইথনে 2.x

এই ফাংশনটি মূলত range()পাইথনে পাওয়া পুরানো ফাংশন 2.xএবং listনির্দিষ্ট পরিসরে উপাদান থাকা কোনও বস্তুর একটি উদাহরণ প্রদান করে an

যাইহোক, সংখ্যার ব্যাপ্তি সহ কোনও তালিকা সূচনা করার সময় এই বাস্তবায়নটি খুব অদক্ষ। উদাহরণস্বরূপ, কার্যকর for i in range(1000000)করতে খুব ব্যয়বহুল কমান্ড হবে, মেমরির এবং সময় ব্যবহারের ক্ষেত্রে উভয় ক্ষেত্রেই এই তালিকার মেমোরিতে স্টোরেজ প্রয়োজন।


range()পাইথন 3.xএবং xrange()পাইথনে2.x

পাইথন 3.xএকটি নতুন বাস্তবায়ন প্রবর্তন করেছিল range()(যখন ফাংশনের 2.xমাধ্যমে পাইথনের মধ্যে নতুন বাস্তবায়ন ইতিমধ্যে উপলব্ধ ছিল xrange())।

range()একটি কৌশল হিসাবে পরিচিত শোষণ অলস মূল্যায়ন। পরিসরে উপাদানের বিশাল তালিকা তৈরি করার পরিবর্তে, নতুন বাস্তবায়ন শ্রেণীর সাথে পরিচিত হয় range, একটি হালকা ওজনের অবজেক্ট যা প্রদত্ত পরিসরে প্রয়োজনীয় উপাদানগুলিকে মেমরিতে স্পষ্টভাবে সংরক্ষণ না করে (এটি জেনারেটরের মতো মনে হতে পারে তবে অলস মূল্যায়নের ধারণাটি হ'ল) বিভিন্ন)।


উদাহরণ হিসাবে, নিম্নলিখিত বিবেচনা করুন:

# Python 2.x
>>> a = range(10)
>>> type(a)
<type 'list'>
>>> b = xrange(10)
>>> type(b)
<type 'xrange'>

এবং

# Python 3.x
>>> a = range(10)
>>> type(a)
<class 'range'>

-2

রেঞ্জ এবং এক্সরেঞ্জের মধ্যে পার্থক্য জানতে এই পোস্টটি দেখুন :

উদ্ধৃতি থেকে:

rangeআপনি যা ভাবেন ঠিক ঠিক তা ফেরত দেয়: 0 দিয়ে শুরু হওয়া সংজ্ঞায়িত দৈর্ঘ্যের একটানা পূর্ণসংখ্যার একটি তালিকা xrange, তবে একটি "এক্সরেঞ্জ অবজেক্ট" প্রদান করে , যা পুনরুক্তির মতো দুর্দান্ত কাজ করে


2
আমি বুঝতে পারি যে এটি 5 বছর বয়সী, তবে এই পোস্টটি প্রায় সব কিছু সম্পর্কে ভুল। xrangeকোনও পুনরুক্তিকারী নয়। ফিরে আসা তালিকাটি rangeপুনরাবৃত্তিকে সমর্থন করে (একটি তালিকা পুনরাবৃত্ত হওয়ার প্রোটোটাইপিকাল উদাহরণ)। এর সামগ্রিক সুবিধা xrange"ন্যূনতম" নয়। ইত্যাদি।
অবতরণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.