উত্তর:
পাইথন ২.x এ:
range
একটি তালিকা তৈরি করে, তাই আপনি যদি range(1, 10000000)
এটি করেন তবে 9999999
উপাদানগুলির সাথে মেমরিতে একটি তালিকা তৈরি করে।
xrange
অলসতার সাথে মূল্যায়ন করে এমন একটি সিকোয়েন্স অবজেক্ট।
পাইথন 3 এ পাইথনের range
সমতুল্য কাজ করে xrange
এবং তালিকাটি পেতে আপনাকে ব্যবহার করতে হবে list(range(...))
।
xrange(x).__iter__()
একটি জেনারেটর।
i
আরম্ভের পরিবর্তে চাহিদা অনুযায়ী মূল্যায়ন করা হয়।
পরিসীমা একটি তালিকা তৈরি করে, তাই আপনি যদি
range(1, 10000000)
এটি করেন তবে9999999
উপাদানগুলির সাথে মেমরিতে একটি তালিকা তৈরি করে।
xrange
একটি জেনারেটর, সুতরাং এটিএকটি সিকোয়েন্স অবজেক্টযাঅলসতার সাথে মূল্যায়ন করে।
এটি সত্য, তবে পাইথন 3 .range()
এ পাইথন 2 দ্বারা প্রয়োগ করা হবে .xrange()
। আপনার যদি আসলে তালিকাটি তৈরি করতে হয় তবে আপনার এটি করতে হবে:
list(range(1,100))
মনে রাখবেন, 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()
যাইহোক আপনাকে সুন্দর পুনরাবৃত্তি আচরণ দেবে।
python -m timeit "for i in xrange(1000000):" " pass"
the extra overhead is only 0.04 seconds
এটি দেখার সঠিক উপায় নয়, (90.5-51.1)/51.1 = 1.771 times slower
সঠিক কারণ এটি জানায় যে এটি যদি আপনার প্রোগ্রামের মূল লুপ হয় তবে এটি সম্ভবত এটির বাধা দিতে পারে। যাইহোক, এটি যদি একটি ছোট অংশ হয় তবে 1.77x অনেক বেশি nt
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
তবে সর্বনিম্ন এবং সর্বাধিক শেষের পয়েন্টগুলির সীমাবদ্ধতা ছাড়াই।
এক্সরেঞ্জ একটি পুনরাবৃত্তিকে রিটার্ন দেয় এবং একসাথে কেবল একটি সংখ্যা রাখে। পরিসীমা সংখ্যাগুলির পুরো তালিকা মেমরিতে রাখে।
xrange
একটি পুনরাবৃত্তি প্রদান করে না ।
and only keeps one number in memory at a time
এবং যেখানে বাকি রয়েছে তা দয়া করে আমাকে গাইড করুন ..
লাইব্রেরি রেফারেন্সের সাথে কিছুটা সময় ব্যয় করবেন । আপনি এর সাথে যত বেশি পরিচিত, তত দ্রুত আপনি এই জাতীয় প্রশ্নের উত্তর পেতে পারেন। বিল্টিন অবজেক্ট এবং প্রকার সম্পর্কে প্রথম কয়েকটি অধ্যায় বিশেষত গুরুত্বপূর্ণ।
এক্সরেঞ্জ টাইপের সুবিধা হ'ল কোনও এক্সরেঞ্জ অবজেক্ট সর্বদা সম পরিমাণের মেমরি গ্রহণ করবে, এটি যে পরিমাণ আকারের প্রতিনিধিত্ব করে তা বিবেচনা করে না। কোনও সামঞ্জস্যপূর্ণ পারফরম্যান্স সুবিধা নেই।
পাইথন কন্সট্রাক্ট সম্পর্কে দ্রুত তথ্য সন্ধান করার আর একটি উপায় হ'ল ডকাস্ট্রিং এবং সহায়তা-কার্য:
print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)
আমি হতবাক কেউ ডক না পড়ে :
এই ফাংশনটি খুব অনুরূপ
range()
, তবেxrange
তালিকার পরিবর্তে কোনও বস্তু প্রদান করে। এটি একটি অস্বচ্ছ ক্রম টাইপ যা একই তালিকায় একই সাথে সবগুলি সংরক্ষণ না করে সংশ্লিষ্ট তালিকার মতো একই মান দেয়।xrange()
ওভারের সুবিধাটিrange()
ন্যূনতম (যেহেতুxrange()
এখনও তাদের জিজ্ঞাসা করার সময় মানগুলি তৈরি করতে হবে) ব্যতীত যখন মেমরি-অনাহারে মেশিনে খুব বড় পরিসর ব্যবহৃত হয় বা যখন পরিসরের সমস্ত উপাদান কখনই ব্যবহার না করা হয় (যেমন লুপটি কখন থাকে) সাধারণত সাথে সমাপ্তbreak
)।
ব্যাপ্তি একটি তালিকা তৈরি করে, সুতরাং আপনি যদি পরিসীমাটি করেন (1, 10000000) এটি 10000000 উপাদানগুলির সাথে মেমরিতে একটি তালিকা তৈরি করে। এক্সরেঞ্জ একটি জেনারেটর, তাই এটি অলসতার সাথে মূল্যায়ন করে।
এটি আপনার জন্য দুটি সুবিধা নিয়ে আসে:
MemoryError
।আপনি এই সাধারণ উদাহরণে 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
পাইথন -৩ এ সরিয়ে ফেলেছে
শুভ কোডিং !!
এটি অপ্টিমাইজেশনের কারণে।
পরিসর () শুরু থেকে শেষ পর্যন্ত মানগুলির একটি তালিকা তৈরি করবে (আপনার উদাহরণে 0 .. 20)। এটি খুব বড় পরিসরে একটি ব্যয়বহুল অপারেশনে পরিণত হবে।
অন্যদিকে xrange () আরও অনেক বেশি অনুকূলিত। এটি যখন প্রয়োজন হবে তখনই পরবর্তী মানটি গণনা করবে (এক্সরেঞ্জ সিকোয়েন্স অবজেক্টের মাধ্যমে) এবং রেঞ্জ () এর মতো সমস্ত মানের একটি তালিকা তৈরি করে না।
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
লুপগুলি ব্যবহার করার সময় খুব বেশি পার্থক্য নেই, যদিও এটি প্রিন্ট করার সময় কোনও তফাত রয়েছে!
রেঞ্জ (): রেঞ্জ (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
অন্যান্য উত্তরগুলির মধ্যে কয়েকটি উল্লেখ করে যে পাইথন 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)
আয় True
2.6-2.7 এবং 3.0-3.1 হয় একটি বাগ যে 3.2 সংশোধন করা হয় এবং ব্যাক-পোর্ট না।
পাইথন 2.x এ
পরিসর (এক্স) এক্স তালিকা সহ মেমোরিতে তৈরি করা একটি তালিকা দেয় created
>>> a = range(5)
>>> a
[0, 1, 2, 3, 4]
xrange (x) একটি এক্সরেঞ্জ অবজেক্ট প্রদান করে যা জেনারেটর অবজ যা চাহিদা অনুযায়ী সংখ্যা উত্পন্ন করে। তারা লুপ (অলস মূল্যায়ন) এর সময় গণনা করা হয়।
লুপিংয়ের জন্য, এটি ব্যাপ্তির চেয়ে সামান্য দ্রুত () এবং আরও মেমরি দক্ষ।
>>> b = xrange(5)
>>> b
xrange(5)
xrange()
জেনারেটর নয়। xrange(n)
.__ ইটার __ () `হয়।
লুপে এক্সরেঞ্জের বিরুদ্ধে পরিসীমা পরীক্ষা করার সময় (আমি জানি আমার সময়সীমা ব্যবহার করা উচিত , তবে এটি একটি সাধারণ তালিকা বোঝার উদাহরণ ব্যবহার করে স্মৃতি থেকে দ্রুত হ্যাক হয়েছিল) আমি নিম্নলিখিতটি পেয়েছি:
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
আমার স্নিপেট পরীক্ষা সঠিকভাবে হয়? এক্সরেঞ্জের ধীর উদাহরণে কোনও মন্তব্য? বা আরও ভাল উদাহরণ :-)
xrange
কিছুটা দ্রুত বলে মনে হয়েছিল, যদিও পাইথন 3 এর সাথে তুলনাটি এখন অপ্রয়োজনীয়।
timeit
জন্য হয়। এটি অনেক সময় দৌড়াতে, জিসি অক্ষম করা, এর পরিবর্তে সেরা ঘড়ি ব্যবহার করা time
ইত্যাদি যত্ন নেয়
পাইথনে এক্সরেঞ্জ () এবং ব্যাপ্তি () ব্যবহারকারীর জন্য একইভাবে কাজ করে, তবে পার্থক্য তখনই আসে যখন আমরা ফাংশন দুটি ব্যবহার করে কীভাবে মেমরি বরাদ্দ করা হয় তা নিয়ে কথা বলছি।
যখন আমরা ব্যাপ্তি () ব্যবহার করি তখন আমরা এটির উত্পন্ন করা সমস্ত ভেরিয়েবলগুলির জন্য মেমরি বরাদ্দ করি, তাই বৃহত্তর নম্বর সহ ব্যবহার করার পরামর্শ দেওয়া হয় না। ভেরিয়েবল উত্পন্ন করা হবে।
অন্যদিকে xrange () কেবল একবারে একটি নির্দিষ্ট মান উত্পন্ন করে এবং প্রয়োজনীয় সমস্ত মান মুদ্রণের জন্য লুপের সাহায্যে ব্যবহার করা যেতে পারে।
কি?
range
রানটাইম স্থিতিশীল তালিকা ফেরত দেয়।
xrange
এমন কোনও ফেরত দেয় object
(যা জেনারেটরের মতো কাজ করে, যদিও এটি অবশ্যই এক নয়) যা থেকে প্রয়োজন হিসাবে যখন মানগুলি উত্পন্ন হয়।
কখন ব্যবহার করবেন?
xrange
আপনি যদি একটি বিশাল ব্যাপ্তির জন্য একটি তালিকা তৈরি করতে চান তবে ব্যবহার করুন 1 বিলিয়ন, বিশেষত যখন আপনার কাছে একটি সেল ফোনের মতো "স্মৃতি সংবেদনশীল সিস্টেম" থাকে sayrange
আপনি তালিকার বেশ কয়েকবার পুনরাবৃত্তি করতে চাইলে ব্যবহার করুন ।PS: পাইথন 3.x এর range
ফাংশন == পাইথন 2.x এর xrange
ফাংশন।
xrange
জেনারেটর বস্তুটি ফেরত দেয় না।
প্রত্যেকেই এটিকে ব্যাপকভাবে ব্যাখ্যা করেছে। তবে আমি এটি নিজের জন্য এটি দেখতে চেয়েছিলাম। আমি পাইথন 3 ব্যবহার করি। সুতরাং, আমি রিসোর্স মনিটরটি খুললাম (উইন্ডোজে!), এবং প্রথমে নিম্নলিখিত কমান্ডটি প্রথমে কার্যকর করেছি:
a=0
for i in range(1,100000):
a=a+i
এবং তারপরে 'ব্যবহৃত' মেমরির পরিবর্তনটি চেক করে। এটা ছিল তুচ্ছ। তারপরে, আমি নিম্নলিখিত কোডটি চালিয়েছি:
for i in list(range(1,100000)):
a=a+i
এবং এটি তাত্ক্ষণিকভাবে ব্যবহারের জন্য মেমরির একটি বড় অংশ নিয়েছে। এবং, আমি বিশ্বাসী ছিল। আপনি নিজের জন্য এটি চেষ্টা করতে পারেন।
আপনি যদি পাইথন 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
মুছে ফেলা হবে।
0-N আইটেমগুলির স্ক্যান / মুদ্রণের জন্য প্রয়োজনীয়তা অনুসারে, রেঞ্জ এবং এক্সরেঞ্জ নিম্নরূপে কাজ করে।
পরিসর () - মেমোরিতে একটি নতুন তালিকা তৈরি করে এবং পুরো 0 থেকে N আইটেমগুলিতে নেয় (সম্পূর্ণ এন + 1) এবং সেগুলি মুদ্রণ করে। এক্সরেঞ্জ () - একটি পুনরাবৃত্ত ইভেন্ট তৈরি করে যা আইটেমগুলির মাধ্যমে স্ক্যান করে এবং কেবলমাত্র বর্তমান মুখোমুখি আইটেমটিকে মেমরিতে রাখে, তাই সর্বদা একই পরিমাণ মেমরি ব্যবহার করে।
যদি তালিকার শুরুতে প্রয়োজনীয় উপাদানটি কিছুটা থাকে তবেই এটি সময় এবং মেমরির একটি ভাল পরিমাণ সঞ্চয় করে।
xrange
একটি পুনরাবৃত্তি উদাহরণ তৈরি করে না। এটি একটি xrange
অবজেক্ট তৈরি করে , যা পুনরাবৃত্তিযোগ্য, তবে কোনও পুনরুক্তিকারী নয় - প্রায় (তবে বেশ নয়) তালিকার মতো একটি ক্রম।
রেঞ্জ একটি তালিকা দেয় যখন এক্সরেঞ্জ একটি এক্সরেঞ্জ অবজেক্ট ফেরত দেয় যা পরিসরের আকার নির্বিশেষে একই মেমরি গ্রহণ করে, যেমন এই ক্ষেত্রে কেবলমাত্র একটি উপাদান তৈরি করা হয় এবং পুনরাবৃত্তির জন্য উপলব্ধ হয় যখন ব্যাপ্তি ব্যবহারের ক্ষেত্রে সমস্ত উপাদান একবারে উত্পন্ন হয় এবং স্মৃতিতে উপলব্ধ।
পার্থক্যটি ছোট আর্গুমেন্টের কাছে 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% বেশি দক্ষ।
ব্যাপ্তি: -রেঞ্জ একবারে সমস্ত কিছুকে বসিয়ে দেবে means যার অর্থ পরিসীমাটির প্রতিটি সংখ্যা স্মৃতি দখল করবে।
এক্সরেঞ্জ: -রেঞ্জার জেনারেটরের মতো কিছু, যখন আপনি সংখ্যার ব্যাপ্তি চান এটি চিত্রে আসবে তবে আপনি চান না যে সেগুলি সংরক্ষণ করা হবে, আপনি যখন লুপ.সো মেমরির দক্ষতার জন্য ব্যবহার করতে চান তখন।
অতিরিক্তভাবে, যদি না হয় list(xrange(...))
সমান হবে range(...)
।
তাই list
ধীর।
এছাড়াও xrange
সত্যই ক্রমটি সম্পূর্ণরূপে শেষ করে না
সুতরাং এটি কেন এটি একটি তালিকা নয়, এটি একটি xrange
বস্তু
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'>
রেঞ্জ এবং এক্সরেঞ্জের মধ্যে পার্থক্য জানতে এই পোস্টটি দেখুন :
উদ্ধৃতি থেকে:
range
আপনি যা ভাবেন ঠিক ঠিক তা ফেরত দেয়: 0 দিয়ে শুরু হওয়া সংজ্ঞায়িত দৈর্ঘ্যের একটানা পূর্ণসংখ্যার একটি তালিকাxrange
, তবে একটি "এক্সরেঞ্জ অবজেক্ট" প্রদান করে , যা পুনরুক্তির মতো দুর্দান্ত কাজ করে
xrange
কোনও পুনরুক্তিকারী নয়। ফিরে আসা তালিকাটি range
পুনরাবৃত্তিকে সমর্থন করে (একটি তালিকা পুনরাবৃত্ত হওয়ার প্রোটোটাইপিকাল উদাহরণ)। এর সামগ্রিক সুবিধা xrange
"ন্যূনতম" নয়। ইত্যাদি।