পাইথনে, কোন ডেটা স্ট্রাকচার আরও দক্ষ / গতিযুক্ত? এই অর্ডারটি আমার পক্ষে গুরুত্বপূর্ণ নয় এবং আমি যে কোনও উপায়ে ডুপ্লিকেটগুলির জন্য যাচাই করে দেখব, পাইথন সেটটি কি পাইথন তালিকার চেয়ে ধীর?
পাইথনে, কোন ডেটা স্ট্রাকচার আরও দক্ষ / গতিযুক্ত? এই অর্ডারটি আমার পক্ষে গুরুত্বপূর্ণ নয় এবং আমি যে কোনও উপায়ে ডুপ্লিকেটগুলির জন্য যাচাই করে দেখব, পাইথন সেটটি কি পাইথন তালিকার চেয়ে ধীর?
উত্তর:
এটি এর সাথে আপনি কী করতে চান তা নির্ভর করে।
সেটগুলিতে উল্লেখযোগ্যভাবে দ্রুত হয় যখন কোনও বস্তু সেটে উপস্থিত রয়েছে তা নির্ধারণের ক্ষেত্রে (যেমন হিসাবে রয়েছে) x in s
) তবে তালিকার চেয়ে ধীর গতিতে আসে যখন বিষয়গুলির উপর পুনরাবৃত্তি ঘটে।
আপনার সময়ের জন্য কোনটি দ্রুত গতিযুক্ত তা দেখতে আপনি টাইমাইট মডিউলটি ব্যবহার করতে পারেন ।
আপনি যখন মানগুলি দিয়ে পুনরাবৃত্তি করতে চান তখন তালিকাগুলি সেটগুলির তুলনায় কিছুটা দ্রুত।
যাইহোক, সেটগুলি তালিকার তুলনায় উল্লেখযোগ্যভাবে দ্রুত হয় যদি আপনি এটিতে কোনও আইটেম অন্তর্ভুক্ত রয়েছে কিনা তা পরীক্ষা করতে চান। তারা শুধুমাত্র অনন্য আইটেম থাকতে পারে।
দেখা যাচ্ছে যে টিউপসগুলি অপরিবর্তনীয়তা বাদে তালিকার মতো প্রায় ঠিক একইভাবে সঞ্চালন করে।
iterating
>>> def iter_test(iterable):
... for i in iterable:
... pass
...
>>> from timeit import timeit
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = set(range(10000))",
... number=100000)
12.666952133178711
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = list(range(10000))",
... number=100000)
9.917098999023438
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = tuple(range(10000))",
... number=100000)
9.865639209747314
কোনও বস্তু উপস্থিত থাকলে তা নির্ধারণ করুন
>>> def in_test(iterable):
... for i in range(1000):
... if i in iterable:
... pass
...
>>> from timeit import timeit
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = set(range(1000))",
... number=10000)
0.5591847896575928
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = list(range(1000))",
... number=10000)
50.18339991569519
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = tuple(range(1000))",
... number=10000)
51.597304821014404
কর্মক্ষমতা তালিকা:
>>> import timeit
>>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000)
0.008128150348026608
কর্মক্ষমতা সেট করুন:
>>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000)
0.005674857488571661
আপনি টিপলস বিবেচনা করতে চাইতে পারেন তালিকার সাথে সমান পারেন তবে সংশোধন করা যায় না। তারা সামান্য কম স্মৃতি গ্রহণ করে এবং অ্যাক্সেস করতে দ্রুত হয়। এগুলি নমনীয় নয় তবে তালিকার চেয়ে দক্ষ than তাদের সাধারণ ব্যবহার হ'ল অভিধান কী হিসাবে পরিবেশন করা।
সেটগুলি সিকোয়েন্স স্ট্রাকচারও তবে তালিকা এবং টিপলস থেকে দুটি পার্থক্য রয়েছে। যদিও সেটের একটি অর্ডার রয়েছে, তবুও সেই আদেশটি নির্বিচারে এবং প্রোগ্রামারের নিয়ন্ত্রণে নয়। দ্বিতীয় পার্থক্যটি হ'ল একটি সেটের উপাদানগুলি অবশ্যই অনন্য হতে হবে।
set
সংজ্ঞানুসারে. [ অজগর | উইকি ]।
>>> x = set([1, 1, 2, 2, 3, 3])
>>> x
{1, 2, 3}
set
বিল্ট-ইন টাইপ লিঙ্কে ( ডকস.পিথথন.আর / ২ /sets
লাইব্রেরি / স্টাডটাইপস html#set ) আপডেট করা উচিত । দ্বিতীয়ত, "সেটগুলিও ক্রম কাঠামো", অন্তর্নির্মিত টাইপ লিঙ্কটি থেকে নিম্নলিখিতটি পড়ুন: "আনর্ডারড সংগ্রহ হিসাবে সেটগুলি উপাদানগুলির অবস্থান বা সন্নিবেশের ক্রম রেকর্ড করে না According তদনুসারে, সেটগুলি ইনডেক্সিং, স্লাইসিং বা অন্যান্য সমর্থন করে না sets ক্রম মত আচরণ। "
range
না list
। range
কাস্টম __contains__
যাদু পদ্ধতি সহ একটি বিশেষ শ্রেণি ।
xrange
)
Set
তাত্ক্ষণিক 'অন্তর্ভুক্ত' চেকগুলির কারণে জিতেছে: https://en.wikedia.org/wiki/Hash_table
তালিকা বাস্তবায়ন: সাধারণত একটি অ্যারে, ধাতুর নিকটবর্তী স্তর, পুনরাবৃত্তির জন্য ভাল এবং উপাদান সূচক দ্বারা এলোমেলো অ্যাক্সেস।
বাস্তবায়ন সেট করুন : https://en.wikedia.org/wiki/Hash_table , এটি কোনও তালিকায় পুনরাবৃত্তি করে না, তবে কী থেকে একটি হ্যাশ গণনা করে উপাদানটি সন্ধান করে , সুতরাং এটি মূল উপাদানগুলির প্রকৃতি এবং হ্যাশের উপর নির্ভর করে ফাংশন। ডিক জন্য ব্যবহৃত হয় অনুরূপ। আমার সন্দেহ হয় list
আপনার যদি খুব কম উপাদান থাকে (<5), বৃহত্তর উপাদানটি আরও ভাল হিসাবে গণনা করা যায়set
একটি চেক অন্তর্ভুক্ত চেকের জন্য সঞ্চালন করবে বলে । এটি উপাদান সংযোজন এবং অপসারণের জন্যও দ্রুত। এছাড়াও সর্বদা মনে রাখবেন যে একটি সেট তৈরি করতে একটি ব্যয় হয়!
দ্রষ্টব্য : যদি list
ইতিমধ্যে বাছাই করা থাকে তবে অনুসন্ধান list
করা বেশ দ্রুত হতে পারে তবে সাধারণ ক্ষেত্রে set
এটির জন্য চেক থাকে এমনটি দ্রুত এবং সহজ।
ডেটা স্ট্রাকচার (ডিএস) গুরুত্বপূর্ণ কারণ এটি মূলত বোঝা যায় যে ডেটাগুলিতে অপারেশন করতে ব্যবহৃত হয়: কিছু ইনপুট নিন , এটি প্রক্রিয়া করুন এবং আউটপুটটি ফিরিয়ে দিন ।
কিছু ডেটা স্ট্রাকচার কিছু নির্দিষ্ট ক্ষেত্রে অন্যদের চেয়ে বেশি কার্যকর। সুতরাং, কোনটি (ডিএস) আরও দক্ষ / গতিযুক্ত তা জিজ্ঞাসা করা মোটেও অন্যায়। এটি কোন ছুরি এবং কাঁটাচামচ মধ্যে কোন সরঞ্জাম আরও দক্ষ জিজ্ঞাসা করার মত হয়। মানে সমস্ত পরিস্থিতি নির্ভর করে on
একটি তালিকা হ'ল পরিবর্তনীয় ক্রম , সাধারণত একজাতীয় আইটেমের সংগ্রহগুলি সঞ্চয় করতে ব্যবহৃত হয় ।
একটি সেট অবজেক্টটি স্বতন্ত্র হ্যাশেবল অবজেক্টগুলির একটি আনর্ডার্ড সংগ্রহ । এটি সাধারণত সদস্যতা পরীক্ষা করতে, ক্রম থেকে সদৃশগুলি অপসারণ এবং গণিতের ক্রিয়াকলাপ যেমন ছেদ, ইউনিয়ন, পার্থক্য এবং প্রতিসম পার্থক্য হিসাবে গণ্য করা হয়।
কিছু উত্তর থেকে, এটি স্পষ্ট যে মানগুলির উপর পুনরাবৃত্তি করার সময় একটি তালিকা একটি সেটের চেয়ে বেশ দ্রুত। অন্যদিকে, কোনও সেট এর মধ্যে কোনও আইটেম রয়েছে কিনা তা পরীক্ষা করার সময় একটি সেট তালিকার চেয়ে দ্রুত হয়। অতএব, কেবলমাত্র আপনি যা বলতে পারবেন তা হ'ল কিছু নির্দিষ্ট ক্রিয়াকলাপ এবং তদ্বিপরীতগুলির জন্য সেটের চেয়ে একটি তালিকা আরও ভাল।
সিপিথনের সাথে, পরীক্ষা করার সময় আমি ফলাফলগুলিতে আগ্রহী ছিলাম, যদি কোনও সংখ্যক আক্ষরিকের মধ্যে একটি মান হয়। set
পাইথন 3 জেতে বনাম tuple
, list
এবং or
:
from timeit import timeit
def in_test1():
for i in range(1000):
if i in (314, 628):
pass
def in_test2():
for i in range(1000):
if i in [314, 628]:
pass
def in_test3():
for i in range(1000):
if i in {314, 628}:
pass
def in_test4():
for i in range(1000):
if i == 314 or i == 628:
pass
print("tuple")
print(timeit("in_test1()", setup="from __main__ import in_test1", number=100000))
print("list")
print(timeit("in_test2()", setup="from __main__ import in_test2", number=100000))
print("set")
print(timeit("in_test3()", setup="from __main__ import in_test3", number=100000))
print("or")
print(timeit("in_test4()", setup="from __main__ import in_test4", number=100000))
আউটপুট:
tuple
4.735646052286029
list
4.7308746771886945
set
3.5755991376936436
or
4.687681658193469
3 থেকে 5 আক্ষরিকের জন্য, set
এখনও বিস্তৃত ব্যবধানে জয়ী হয় এবং or
ধীরে ধীরে হয়ে যায়।
পাইথন 2- set
এ সর্বদা সবচেয়ে ধীর হয়। or
2 থেকে 3 লিটারেল সবচেয়ে দ্রুত, এবং tuple
এবং list
দ্রুত 4 বা তার বেশি লিটারেল সঙ্গে আছে। tuple
বনামের গতি আমি আলাদা করতে পারিনি list
।
যখন পরীক্ষার মানগুলি লুপের মধ্যে আক্ষরিক তৈরি করার পরিবর্তে ফাংশনটির বাইরে বৈশ্বিক পরিবর্তনশীল হিসাবে ক্যাশ করা হয়, set
প্রতিবার জিতল, এমনকি পাইথন 2 তেও।
এই ফলাফলগুলি একটি কোর আই 7-তে 64-বিট সিপিথনের জন্য প্রযোজ্য।
আমি একটি সেট বাস্তবায়ন প্রস্তাব করব যেখানে ব্যবহারের ক্ষেত্রে রেফারেন্সিং বা অস্তিত্ব এবং টুপল বাস্তবায়নের সীমা রয়েছে যেখানে ব্যবহারের ক্ষেত্রে পুনরাবৃত্তি করা দরকার। একটি তালিকা একটি নিম্ন-স্তরের বাস্তবায়ন এবং উল্লেখযোগ্য মেমরির ওভারহেডের প্রয়োজন।
from datetime import datetime
listA = range(10000000)
setA = set(listA)
tupA = tuple(listA)
#Source Code
def calc(data, type):
start = datetime.now()
if data in type:
print ""
end = datetime.now()
print end-start
calc(9999, listA)
calc(9999, tupA)
calc(9999, setA)
সমস্ত 3 এর জন্য 10 পুনরাবৃত্তির তুলনা করার পরে আউটপুট: তুলনা
সেটগুলি দ্রুততর হয়, মোরোভার আপনি সেটগুলির সাথে আরও বেশি ফাংশন পান, যেমন ধরুন আপনার দুটি সেট রয়েছে:
set1 = {"Harry Potter", "James Bond", "Iron Man"}
set2 = {"Captain America", "Black Widow", "Hulk", "Harry Potter", "James Bond"}
আমরা সহজেই দুটি সেটে যোগ দিতে পারি:
set3 = set1.union(set2)
উভয় মধ্যে কি সাধারণ তা খুঁজে বের করুন:
set3 = set1.intersection(set2)
উভয়ের মধ্যে কী আলাদা তা সন্ধান করুন:
set3 = set1.difference(set2)
এবং আরো অনেক কিছু! কেবল তাদের চেষ্টা করে দেখুন, তারা মজা করছে! তবুও যদি আপনাকে 2 টি তালিকার মধ্যে 2 টির মধ্যে সাধারণ মান বা 2 টি তালিকার মধ্যে সাধারণ মানগুলি নিয়ে কাজ করতে হয় তবে আমি আপনার তালিকাগুলিকে সেটগুলিতে রূপান্তর করতে পছন্দ করি এবং অনেক প্রোগ্রামার সেভাবে করে। আশা করি এটি আপনাকে সাহায্য করে :-)