উত্তর:
এটি উল (1) (ধ্রুবক সময়, উপাদানটির প্রকৃত দৈর্ঘ্যের উপর নির্ভর করে না - খুব দ্রুত) আপনার উল্লেখ করা প্রতিটি ধরণের উপর, set
এবং অন্যান্য যেমন array.array
।
Lên কলিং () ঐ ধরনের তথ্য উপর হে (1) হয় CPython , পাইথন ভাষা সবচেয়ে সাধারণ বাস্তবায়ন। এখানে একটি টেবিলের লিঙ্ক রয়েছে যা সিপিথনে বিভিন্ন ফাংশনের অ্যালগরিদমিক জটিলতা সরবরাহ করে:
এই সমস্ত বস্তু তাদের নিজস্ব দৈর্ঘ্যের উপর নজর রাখে। দৈর্ঘ্য আহরণের সময়টি ছোট (ও (1) বিগ-ও স্বরলিপিতে) এবং বেশিরভাগ ক্ষেত্রে [অজস্র বিবরণ, পাইথনের পদে লিখিত হয়, সি পদে নয়]: একটি অভিধানে "লেন" দেখুন এবং এটি প্রেরণ করুন বিল্ট_ইন লেন ফাংশন যা অবজেক্টের __len__
পদ্ধতিটি সন্ধান করবে এবং কল করবে ... এটি করতে হবেreturn self.length
length
অভিধানে প্রদর্শিত হয় না dir(list)
?
list.lenght
পরিবর্তনশীল সিটিতে প্রয়োগ করা হয়েছে, পাইথন নয়।
নীচের পরিমাপগুলি প্রমাণিত তথ্য সরবরাহ করে যা len()
ব্যবহারযোগ্য পরিমাণে কাঠামোর জন্য O (1)।
সম্পর্কিত একটি নোট timeit
: যখন -s
পতাকাটি ব্যবহৃত হয় এবং দুটি স্ট্রিং timeit
প্রথম স্ট্রিংয়ে পৌঁছে দেওয়া হয় কেবল একবার কার্যকর করা হয় এবং সময়সাপেক্ষে হয় না।
$ python -m timeit -s "l = range(10);" "len(l)"
10000000 loops, best of 3: 0.0677 usec per loop
$ python -m timeit -s "l = range(1000000);" "len(l)"
10000000 loops, best of 3: 0.0688 usec per loop
$ python -m timeit -s "t = (1,)*10;" "len(t)"
10000000 loops, best of 3: 0.0712 usec per loop
$ python -m timeit -s "t = (1,)*1000000;" "len(t)"
10000000 loops, best of 3: 0.0699 usec per loop
$ python -m timeit -s "s = '1'*10;" "len(s)"
10000000 loops, best of 3: 0.0713 usec per loop
$ python -m timeit -s "s = '1'*1000000;" "len(s)"
10000000 loops, best of 3: 0.0686 usec per loop
$ python -mtimeit -s"d = {i:j for i,j in enumerate(range(10))};" "len(d)"
10000000 loops, best of 3: 0.0711 usec per loop
$ python -mtimeit -s"d = {i:j for i,j in enumerate(range(1000000))};" "len(d)"
10000000 loops, best of 3: 0.0727 usec per loop
$ python -mtimeit -s"import array;a=array.array('i',range(10));" "len(a)"
10000000 loops, best of 3: 0.0682 usec per loop
$ python -mtimeit -s"import array;a=array.array('i',range(1000000));" "len(a)"
10000000 loops, best of 3: 0.0753 usec per loop
$ python -mtimeit -s"s = {i for i in range(10)};" "len(s)"
10000000 loops, best of 3: 0.0754 usec per loop
$ python -mtimeit -s"s = {i for i in range(1000000)};" "len(s)"
10000000 loops, best of 3: 0.0713 usec per loop
$ python -mtimeit -s"from collections import deque;d=deque(range(10));" "len(d)"
100000000 loops, best of 3: 0.0163 usec per loop
$ python -mtimeit -s"from collections import deque;d=deque(range(1000000));" "len(d)"
100000000 loops, best of 3: 0.0163 usec per loop
len()
এবং -s
পতাকাটি সঠিকভাবে ব্যবহারের জন্য পরিমাপগুলিও ঠিক করেছি ।
python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"
ভেরিয়েলেলে সংরক্ষণ করা একটি উল্লেখযোগ্য পরিমাণের গণনার সময় সাশ্রয় করতে পারে: 223 এনএসপি প্রতি লুপ প্রতি python -m timeit -s "l = range(100);" "len(l)"
66.2 এনসিএস প্রতি লুপ
লেন একটি ও (1) কারণ আপনার র্যামে তালিকাগুলি টেবিল হিসাবে সংরক্ষণ করা হয় (ধারাবাহিক ঠিকানার সিরিজ)। টেবিলটি কম্পিউটারটি কখন থামবে তা জানার জন্য দুটি জিনিস দরকার: দৈর্ঘ্য এবং প্রারম্ভিক বিন্দু। এই কারণেই লেন () একটি ও (1) হয়, কম্পিউটারটি মূল্য সঞ্চয় করে, তাই এটি কেবল এটি সন্ধান করা প্রয়োজন।
আমি পাইথনে লেন () ভাবছিলাম তালিকার আকারের উপর নির্ভর করে, তাই আমি যদি একাধিকবার ব্যবহার করি তবে আমি সর্বদা দৈর্ঘ্যকে একটি চলকটিতে সঞ্চয় করি। তবে আজ ডিবাগ করার সময় আমি লক্ষ করেছি __len__ তালিকার তালিকায় বিশিষ্টতা, সুতরাং লেন () অবশ্যই এটি আনছে, যা জটিলতা O (1) করে। কেউ যদি ইতিমধ্যে এটি জিজ্ঞাসা করে এবং এই পোস্টটি জুড়ে আসে তবে আমি কেবল গুগল করেছিলাম।
__len__
একটি মজাদার ঘটনা, কোনও পরিবর্তনশীল নয় যা তালিকার দৈর্ঘ্যের প্রতিনিধিত্ব করে।
list.__len__
স্থির সময়ে ফাংশনটি চলে? এটি করে, তবে এটি কারণ নয় এটি একটি ফাংশন। কারণ এটি হিসাবে বাস্তবায়ন।