এটি আমার বোধগম্য যে range()
ফাংশনটি আসলে পাইথন 3- তে একটি অবজেক্ট টাইপ , এটি জেনারেটরের মতোই ফ্লাইতে তার সামগ্রী তৈরি করে।
এটি হ'ল, আমি নিম্নলিখিত লাইনটি একটি প্রচুর পরিমাণে সময় নেওয়ার প্রত্যাশা করতাম, কারণ 1 কোয়াড্রিলিয়ন সীমার মধ্যে রয়েছে কিনা তা নির্ধারণ করার জন্য, এক চতুর্থাংশের মান তৈরি করতে হবে:
1000000000000000 in range(1000000000000001)
তদুপরি: এটি দেখে মনে হচ্ছে যে আমি যত জিরো যুক্ত করি না কেন, গণনা কম-বেশি একই পরিমাণ সময় নেয় (মূলত তাত্ক্ষণিক)।
আমি এ জাতীয় জিনিসও চেষ্টা করেছি, তবে গণনা এখনও প্রায় তাত্ক্ষণিক:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
যদি আমি আমার নিজস্ব পরিসীমা ফাংশন বাস্তবায়নের চেষ্টা করি, ফলাফলটি এত সুন্দর হয় না !!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
range()
হুডের নীচে কী করা হচ্ছে যা এত তাড়াতাড়ি করে তোলে?
Martijn Pieters 'উত্তর তার সম্পূর্ণতার জন্য নির্বাচিত করা হয়, কিন্তু তাও দেখতে abarnert প্রথম উত্তর কি এটা জন্য মানে একটি ভাল আলোচনার জন্য range
একটি পূর্ণাঙ্গ হতে ক্রম পাইথন 3, এবং কিছু তথ্য / জন্য সম্ভাব্য অসঙ্গতি সংক্রান্ত সতর্কীকরণ __contains__
পাইথন বাস্তবায়নের জুড়ে ফাংশন অপ্টিমাইজেশান । অ্যাবারনার্টের অন্য উত্তরটি আরও বিশদে যায় এবং পাইথন 3 (এবং xrange
পাইথন 2 এ অপ্টিমাইজেশনের অভাব) এর পিছনে ইতিহাসে আগ্রহীদের জন্য লিঙ্ক সরবরাহ করে । কৌতুক এবং উইম দ্বারা উত্তর প্রাসঙ্গিক সি উত্স কোড এবং যারা আগ্রহী তাদের ব্যাখ্যা প্রদান করে।
range
জেনারেটর?
xrange
Python3 হিসাবে একইrange
?
xrange()
অবজেক্টগুলির কোনও __contains__
পদ্ধতি নেই, তাই আইটেম চেকটি সমস্ত আইটেমের মধ্যে লুপ করতে হবে। এছাড়াও এর মধ্যে আরও কয়েকটি পরিবর্তন রয়েছে range()
যেমন এটি স্লাইসিংকে সমর্থন করে (যা আবার কোনও range
বস্তুকে প্রত্যাবর্তন করে ) এবং এখন এবিসির সাথে সামঞ্জস্যপূর্ণ করার পদ্ধতি count
এবং index
পদ্ধতিও রয়েছে collections.Sequence
।
bool
বাlong
টাইপ হয়, অন্য অবজেক্টের ধরণের সাথে এটি পাগল হয়ে যায়। চেষ্টা করে দেখুন:100000000000000.0 in range(1000000000000001)