লেন () ফাংশনের ব্যয়


উত্তর:


341

এটি উল (1) (ধ্রুবক সময়, উপাদানটির প্রকৃত দৈর্ঘ্যের উপর নির্ভর করে না - খুব দ্রুত) আপনার উল্লেখ করা প্রতিটি ধরণের উপর, setএবং অন্যান্য যেমন array.array


17
সহায়ক উত্তরের জন্য ধন্যবাদ! এমন কোনও দেশীয় প্রকার রয়েছে যার জন্য এটি ঘটেনি?
mvanveen

141

Lên কলিং () ঐ ধরনের তথ্য উপর হে (1) হয় CPython , পাইথন ভাষা সবচেয়ে সাধারণ বাস্তবায়ন। এখানে একটি টেবিলের লিঙ্ক রয়েছে যা সিপিথনে বিভিন্ন ফাংশনের অ্যালগরিদমিক জটিলতা সরবরাহ করে:

টাইমকম্প্লেসিটি পাইথন উইকি পৃষ্ঠা


84

এই সমস্ত বস্তু তাদের নিজস্ব দৈর্ঘ্যের উপর নজর রাখে। দৈর্ঘ্য আহরণের সময়টি ছোট (ও (1) বিগ-ও স্বরলিপিতে) এবং বেশিরভাগ ক্ষেত্রে [অজস্র বিবরণ, পাইথনের পদে লিখিত হয়, সি পদে নয়]: একটি অভিধানে "লেন" দেখুন এবং এটি প্রেরণ করুন বিল্ট_ইন লেন ফাংশন যা অবজেক্টের __len__পদ্ধতিটি সন্ধান করবে এবং কল করবে ... এটি করতে হবেreturn self.length


3
আমি মনে করি এটি সবচেয়ে উপযুক্ত উত্তর কারণ এটি প্রয়োগের বিশদটি অন্তর্দৃষ্টি দেয়।
একে

কেন lengthঅভিধানে প্রদর্শিত হয় না dir(list)?
ভিআইএফআই

এটি আমি যা খুঁজছিলাম
বিশাখ বিজয়ন

@ ভিআইএফআই কারণ এটি কেবল একটি উদাহরণ। চিত্রিত list.lenghtপরিবর্তনশীল সিটিতে প্রয়োগ করা হয়েছে, পাইথন নয়।
কোওলস্কি

73

নীচের পরিমাপগুলি প্রমাণিত তথ্য সরবরাহ করে যা 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

Tuple:

$ 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

অভিধান (অভিধান-উপলব্ধি 2.7+ এ উপলব্ধ):

$ 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

সেট (সেট 2.2++ উপলব্ধ উপলব্ধি):

$ 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

Deque:

$ 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

1
এটি একটি মানদণ্ডের পক্ষে এতটা ভাল নয় যদিও এটি ইতিমধ্যে যা জানি তা প্রদর্শন করে। এটি কারণ 10 (10) এবং পরিসীমা (1000000) ও (1) হওয়ার কথা নয়।
অজানা

3
এটি এখন পর্যন্ত সেরা উত্তর। কেউ যদি স্থির সময় বুঝতে না পারে সে ক্ষেত্রে আপনার কেবল একটি উপসংহার যোগ করা উচিত।
সান্টিয়াগোবসুলতো

4
মন্তব্যের জন্য ধন্যবাদ. আমি ও (1) এর জটিলতা সম্পর্কে একটি নোট যুক্ত করেছি 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 এনসিএস প্রতি লুপ
স্টোয়ানভ

16

লেন একটি ও (1) কারণ আপনার র‌্যামে তালিকাগুলি টেবিল হিসাবে সংরক্ষণ করা হয় (ধারাবাহিক ঠিকানার সিরিজ)। টেবিলটি কম্পিউটারটি কখন থামবে তা জানার জন্য দুটি জিনিস দরকার: দৈর্ঘ্য এবং প্রারম্ভিক বিন্দু। এই কারণেই লেন () একটি ও (1) হয়, কম্পিউটারটি মূল্য সঞ্চয় করে, তাই এটি কেবল এটি সন্ধান করা প্রয়োজন।


3

আমি পাইথনে লেন () ভাবছিলাম তালিকার আকারের উপর নির্ভর করে, তাই আমি যদি একাধিকবার ব্যবহার করি তবে আমি সর্বদা দৈর্ঘ্যকে একটি চলকটিতে সঞ্চয় করি। তবে আজ ডিবাগ করার সময় আমি লক্ষ করেছি __len__ তালিকার তালিকায় বিশিষ্টতা, সুতরাং লেন () অবশ্যই এটি আনছে, যা জটিলতা O (1) করে। কেউ যদি ইতিমধ্যে এটি জিজ্ঞাসা করে এবং এই পোস্টটি জুড়ে আসে তবে আমি কেবল গুগল করেছিলাম।


তবে __len__একটি মজাদার ঘটনা, কোনও পরিবর্তনশীল নয় যা তালিকার দৈর্ঘ্যের প্রতিনিধিত্ব করে।
কোওলস্কি

@ কোওলস্কি হ্যাঁ লেন একটি ফাংশন তবে এটি যা করে তা হ'ল এটি স্ব
আয়ুষ সেনাপতি

তবে আপনার পোস্টটি সে সম্পর্কে কিছুই বলে না। এছাড়াও আপনি কীভাবে জানবেন যে list.__len__স্থির সময়ে ফাংশনটি চলে? এটি করে, তবে এটি কারণ নয় এটি একটি ফাংশন। কারণ এটি হিসাবে বাস্তবায়ন।
কাউয়ালস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.