পাইথন সেট বনাম তালিকা


187

পাইথনে, কোন ডেটা স্ট্রাকচার আরও দক্ষ / গতিযুক্ত? এই অর্ডারটি আমার পক্ষে গুরুত্বপূর্ণ নয় এবং আমি যে কোনও উপায়ে ডুপ্লিকেটগুলির জন্য যাচাই করে দেখব, পাইথন সেটটি কি পাইথন তালিকার চেয়ে ধীর?

উত্তর:


230

এটি এর সাথে আপনি কী করতে চান তা নির্ভর করে।

সেটগুলিতে উল্লেখযোগ্যভাবে দ্রুত হয় যখন কোনও বস্তু সেটে উপস্থিত রয়েছে তা নির্ধারণের ক্ষেত্রে (যেমন হিসাবে রয়েছে) x in s ) তবে তালিকার চেয়ে ধীর গতিতে আসে যখন বিষয়গুলির উপর পুনরাবৃত্তি ঘটে।

আপনার সময়ের জন্য কোনটি দ্রুত গতিযুক্ত তা দেখতে আপনি টাইমাইট মডিউলটি ব্যবহার করতে পারেন ।


4
আপনার বক্তব্যটির জন্য: "সেটগুলি উল্লেখযোগ্যভাবে দ্রুত হয়", অন্তর্নিহিত বাস্তবায়ন এটি আরও দ্রুত করে তোলে?
ওভাররেজচেঞ্জ

স্ক্রিপ্টিং ভাষাগুলি অন্তর্নিহিত বাস্তবায়নগুলি গোপন করতে পছন্দ করে তবে এই আপাত সরলতা সর্বদা ভাল জিনিস নয়, আপনি যখন কোনও সফ্টওয়্যার তৈরির নকশা তৈরি করেন তখন আপনার কিছু 'ডেটা স্ট্রাকচার' সচেতনতা প্রয়োজন।
ক্রিস্টোফ রাউসি

4
পুনরাবৃত্তি করার সময় সেটটি তালিকার চেয়ে উল্লেখযোগ্যভাবে ধীর হয় না।
omeferarukdogan

39
সেট এবং তালিকার উভয়েরই লিনিয়ার সময় পুনরাবৃত্তি থাকে। অন্যটির তুলনায় একজন "ধীর" এটি ভুল পথে চালিত হয়েছে এবং এই উত্তরটি পড়ে এমন নতুন প্রোগ্রামারদের বিভ্রান্ত করেছেন।
হাবনবিত 16'18

@ অহনাবিট আপনি যদি বলছেন যে তাদের উভয়েরই লিনিয়ার সময় পুনরাবৃত্তি রয়েছে। এর অর্থ কি তাদের একই পুনরাবৃত্তির সময় আছে? তাহলে তফাত কী?
মোহাম্মদ নুরাল্ডিন

152

আপনি যখন মানগুলি দিয়ে পুনরাবৃত্তি করতে চান তখন তালিকাগুলি সেটগুলির তুলনায় কিছুটা দ্রুত।

যাইহোক, সেটগুলি তালিকার তুলনায় উল্লেখযোগ্যভাবে দ্রুত হয় যদি আপনি এটিতে কোনও আইটেম অন্তর্ভুক্ত রয়েছে কিনা তা পরীক্ষা করতে চান। তারা শুধুমাত্র অনন্য আইটেম থাকতে পারে।

দেখা যাচ্ছে যে টিউপসগুলি অপরিবর্তনীয়তা বাদে তালিকার মতো প্রায় ঠিক একইভাবে সঞ্চালন করে।

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

6
আমি খুঁজে পেয়েছি (সেট শুরু -> 5.5300979614257812) (তালিকার সূচনা -> 1.8846848011016846) (শুরু টিপল -> 1.8730108737945557) আমার ইন্টেল কোর i5 কোয়াড কোরে 12 গিগাবাইট র‌্যামের সাথে 10,000 মাপের আইটেম। এটিও বিবেচনায় নেওয়া উচিত।
ThePracticalOne

4
আমি এখন অবজেক্টটি তৈরি করতে অপসারণের জন্য কোডটি আপডেট করেছি। টাইমিট লুপগুলির সেটআপ পর্বটি কেবল একবার ডাকা হয় ( ডকস.পিথথন.আর / ২ / লাইব্রেরি / টাইম.ইচটিএমএল# টাইমাইট.টাইমআর টাইমাইট )।
এলিস পারসিভাল

7

কর্মক্ষমতা তালিকা:

>>> 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}

4
প্রথমে, আপনার অবহিত লাইব্রেরিটি না করে setবিল্ট-ইন টাইপ লিঙ্কে ( ডকস.পিথথন.আর / ২ /sets লাইব্রেরি / স্টাডটাইপস html#set ) আপডেট করা উচিত । দ্বিতীয়ত, "সেটগুলিও ক্রম কাঠামো", অন্তর্নির্মিত টাইপ লিঙ্কটি থেকে নিম্নলিখিতটি পড়ুন: "আনর্ডারড সংগ্রহ হিসাবে সেটগুলি উপাদানগুলির অবস্থান বা সন্নিবেশের ক্রম রেকর্ড করে না According তদনুসারে, সেটগুলি ইনডেক্সিং, স্লাইসিং বা অন্যান্য সমর্থন করে না sets ক্রম মত আচরণ। "
Seaux

7
rangeনা listrangeকাস্টম __contains__যাদু পদ্ধতি সহ একটি বিশেষ শ্রেণি ।
রাই ওয়াং

@ রাইনওয়াং এটি সত্য, তবে কেবল পাইথন 3-এর জন্য। পাইথন 2 পরিসীমাটিতে একটি সাধারণ তালিকা ফিরে আসে (এ কারণেই ভয়াবহ জিনিসগুলি উপস্থিত রয়েছে xrange)
মানোয়েল ভিলেলা

7

Setতাত্ক্ষণিক 'অন্তর্ভুক্ত' চেকগুলির কারণে জিতেছে: https://en.wikedia.org/wiki/Hash_table

তালিকা বাস্তবায়ন: সাধারণত একটি অ্যারে, ধাতুর নিকটবর্তী স্তর, পুনরাবৃত্তির জন্য ভাল এবং উপাদান সূচক দ্বারা এলোমেলো অ্যাক্সেস।

বাস্তবায়ন সেট করুন : https://en.wikedia.org/wiki/Hash_table , এটি কোনও তালিকায় পুনরাবৃত্তি করে না, তবে কী থেকে একটি হ্যাশ গণনা করে উপাদানটি সন্ধান করে , সুতরাং এটি মূল উপাদানগুলির প্রকৃতি এবং হ্যাশের উপর নির্ভর করে ফাংশন। ডিক জন্য ব্যবহৃত হয় অনুরূপ। আমার সন্দেহ হয় listআপনার যদি খুব কম উপাদান থাকে (<5), বৃহত্তর উপাদানটি আরও ভাল হিসাবে গণনা করা যায়set একটি চেক অন্তর্ভুক্ত চেকের জন্য সঞ্চালন করবে বলে । এটি উপাদান সংযোজন এবং অপসারণের জন্যও দ্রুত। এছাড়াও সর্বদা মনে রাখবেন যে একটি সেট তৈরি করতে একটি ব্যয় হয়!

দ্রষ্টব্য : যদি listইতিমধ্যে বাছাই করা থাকে তবে অনুসন্ধান listকরা বেশ দ্রুত হতে পারে তবে সাধারণ ক্ষেত্রে setএটির জন্য চেক থাকে এমনটি দ্রুত এবং সহজ।


8
ধাতব কাছে? পাইথনের প্রসঙ্গে এর অর্থ কী? একটি সেট তুলনায় ধাতুর কাছাকাছি একটি তালিকা কীভাবে?
রোঞ্জোশ

@roganjosh, পাইথন এখনও একটি মেশিন উপর সঞ্চালিত হয় এবং 'অ্যারে' হিসেবে তালিকা মত কিছু বাস্তবায়নের হার্ডওয়্যার কি সময়ে ভাল কাছাকাছি আছেন: stackoverflow.com/questions/176011/... , কিন্তু এটা সবসময় কি আপনি অর্জন, এটি করতে চান উপর নির্ভর করে বাস্তবায়নগুলি সম্পর্কে কিছুটা জানা ভাল, কেবল বিমূর্ততা নয়।
ক্রিস্টোফ রাউসি

2

TL; ড

ডেটা স্ট্রাকচার (ডিএস) গুরুত্বপূর্ণ কারণ এটি মূলত বোঝা যায় যে ডেটাগুলিতে অপারেশন করতে ব্যবহৃত হয়: কিছু ইনপুট নিন , এটি প্রক্রিয়া করুন এবং আউটপুটটি ফিরিয়ে দিন

কিছু ডেটা স্ট্রাকচার কিছু নির্দিষ্ট ক্ষেত্রে অন্যদের চেয়ে বেশি কার্যকর। সুতরাং, কোনটি (ডিএস) আরও দক্ষ / গতিযুক্ত তা জিজ্ঞাসা করা মোটেও অন্যায়। এটি কোন ছুরি এবং কাঁটাচামচ মধ্যে কোন সরঞ্জাম আরও দক্ষ জিজ্ঞাসা করার মত হয়। মানে সমস্ত পরিস্থিতি নির্ভর করে on

তালিকাসমূহ

একটি তালিকা হ'ল পরিবর্তনীয় ক্রম , সাধারণত একজাতীয় আইটেমের সংগ্রহগুলি সঞ্চয় করতে ব্যবহৃত হয়

সেট

একটি সেট অবজেক্টটি স্বতন্ত্র হ্যাশেবল অবজেক্টগুলির একটি আনর্ডার্ড সংগ্রহ । এটি সাধারণত সদস্যতা পরীক্ষা করতে, ক্রম থেকে সদৃশগুলি অপসারণ এবং গণিতের ক্রিয়াকলাপ যেমন ছেদ, ইউনিয়ন, পার্থক্য এবং প্রতিসম পার্থক্য হিসাবে গণ্য করা হয়।

ব্যবহার

কিছু উত্তর থেকে, এটি স্পষ্ট যে মানগুলির উপর পুনরাবৃত্তি করার সময় একটি তালিকা একটি সেটের চেয়ে বেশ দ্রুত। অন্যদিকে, কোনও সেট এর মধ্যে কোনও আইটেম রয়েছে কিনা তা পরীক্ষা করার সময় একটি সেট তালিকার চেয়ে দ্রুত হয়। অতএব, কেবলমাত্র আপনি যা বলতে পারবেন তা হ'ল কিছু নির্দিষ্ট ক্রিয়াকলাপ এবং তদ্বিপরীতগুলির জন্য সেটের চেয়ে একটি তালিকা আরও ভাল।


2

সিপিথনের সাথে, পরীক্ষা করার সময় আমি ফলাফলগুলিতে আগ্রহী ছিলাম, যদি কোনও সংখ্যক আক্ষরিকের মধ্যে একটি মান হয়। 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এ সর্বদা সবচেয়ে ধীর হয়। or2 থেকে 3 লিটারেল সবচেয়ে দ্রুত, এবং tupleএবং listদ্রুত 4 বা তার বেশি লিটারেল সঙ্গে আছে। tupleবনামের গতি আমি আলাদা করতে পারিনি list

যখন পরীক্ষার মানগুলি লুপের মধ্যে আক্ষরিক তৈরি করার পরিবর্তে ফাংশনটির বাইরে বৈশ্বিক পরিবর্তনশীল হিসাবে ক্যাশ করা হয়, set প্রতিবার জিতল, এমনকি পাইথন 2 তেও।

এই ফলাফলগুলি একটি কোর আই 7-তে 64-বিট সিপিথনের জন্য প্রযোজ্য।


0

আমি একটি সেট বাস্তবায়ন প্রস্তাব করব যেখানে ব্যবহারের ক্ষেত্রে রেফারেন্সিং বা অস্তিত্ব এবং টুপল বাস্তবায়নের সীমা রয়েছে যেখানে ব্যবহারের ক্ষেত্রে পুনরাবৃত্তি করা দরকার। একটি তালিকা একটি নিম্ন-স্তরের বাস্তবায়ন এবং উল্লেখযোগ্য মেমরির ওভারহেডের প্রয়োজন।


1
প্রকৃতপক্ষে কখন Sets ব্যবহার করবেন এবং কখন Tuple ব্যবহার করবেন তার মধ্যে যথাযথ পার্থক্য প্রকৃতপক্ষে অত্যন্ত গুরুত্বপূর্ণ। আমি জড়িত মেমরির ওভারহেডগুলি, পায়ের ছাপগুলি সম্পর্কে চিন্তিত হব না যতক্ষণ না আমি নিম্ন স্তরের এপিআই স্ক্রিপ্ট না করি।

0
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 পুনরাবৃত্তির তুলনা করার পরে আউটপুট: তুলনা


0

সেটগুলি দ্রুততর হয়, মোরোভার আপনি সেটগুলির সাথে আরও বেশি ফাংশন পান, যেমন ধরুন আপনার দুটি সেট রয়েছে:

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 টি তালিকার মধ্যে সাধারণ মানগুলি নিয়ে কাজ করতে হয় তবে আমি আপনার তালিকাগুলিকে সেটগুলিতে রূপান্তর করতে পছন্দ করি এবং অনেক প্রোগ্রামার সেভাবে করে। আশা করি এটি আপনাকে সাহায্য করে :-)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.