আমি বুঝতে পারি যে এগুলি উভয়ই মূলত একই জিনিস, তবে শৈলীর দিক থেকে, কোন খালি তালিকা বা ডিক তৈরি করতে আরও ভাল (আরও পাইথোনিক) ব্যবহার করা উচিত?
আমি বুঝতে পারি যে এগুলি উভয়ই মূলত একই জিনিস, তবে শৈলীর দিক থেকে, কোন খালি তালিকা বা ডিক তৈরি করতে আরও ভাল (আরও পাইথোনিক) ব্যবহার করা উচিত?
উত্তর:
গতির দিক দিয়ে, এটি খালি তালিকা / জালিয়াতির জন্য কোনও প্রতিযোগিতা নয়:
>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077
এবং খালি নয়:
>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267
এছাড়াও, বন্ধনী স্বরলিপি ব্যবহার করে আপনি তালিকা এবং অভিধান বোঝার জন্য ব্যবহার করতে পারবেন যা যথেষ্ট কারণ হতে পারে।
timeit()
ফাংশনটি নির্দিষ্ট পরিমাণ পুনরাবৃত্তি সম্পাদন করতে মোট সময়ের পরিমাণ রিপোর্ট করে যা 1000000
ডিফল্টরূপে। সুতরাং উপরের উদাহরণগুলি হ'ল এক মিলিয়ন বার স্নিপেট কোড চালানোর জন্য সেকেন্ডের সংখ্যা। উদাহরণস্বরূপ timeit('dict()', number=1) // -> 4.0531158447265625e-06
(একটি পুনরাবৃত্তি) যখন timeit('dict()') // -> 0.12412905693054199
(এক মিলিয়ন পুনরাবৃত্তি)
আমার মতে []
এবং {}
খালি তালিকা / ডিস্ক তৈরির সর্বাধিক পাইথোনিক এবং পঠনযোগ্য উপায় are
set()
যদিও সতর্ক থাকুন , উদাহরণস্বরূপ:
this_set = {5}
some_other_set = {}
বিভ্রান্তিকর হতে পারে। প্রথম এক উপাদান সঙ্গে একটি সেট তৈরি করে, দ্বিতীয় একটি খালি অভি এবং সৃষ্টি না একটি সেট।
{}
সর্বদা একটি খালি ডিক তৈরি করে। {1,2,3}
২.7+ এ একটি সেট তৈরি করে তবে এটি 2.6
পুরানো সংস্করণে একটি বাক্য গঠন ত্রুটি ।
some_epic_set
খালি dict
বস্তুটির দিকে নির্দেশ করছে ... এটি কোনও খালি সেট নয়। একটি খালি সেট জন্য আপনার ব্যবহার করা প্রয়োজন set()
।
{5}
যা একটি উপাদান দিয়ে একটি সেট তৈরি করে 5
এবং {}
এটি খালি ডিক্ট।
{*()}
খালি তৈরি করতে ব্যবহার করতে পারেন set
। আমি একে একচক্ষু বানর অপারেটর বলি। :-)
অভি আক্ষরিক একটি হতে পারে অতি ক্ষুদ্র বিট দ্রুততর তার বাইটকোড খাটো:
In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()
In [4]: dis.dis(a)
1 0 BUILD_MAP 0
3 RETURN_VALUE
In [5]: dis.dis(b)
1 0 LOAD_GLOBAL 0 (dict)
3 CALL_FUNCTION 0
6 RETURN_VALUE
একই ক্ষেত্রে প্রযোজ্য list
বনাম[]
CALL_FUNCTION
লাগে (ফাংশনটি মূলত বলা হয় ) এবং এটি অতিরিক্ত অতিরিক্ত ওভারহেড নেয়। BUILD_MAP
BUILD_MAP
LOAD_GLOBAL
আইএমএইচও, ব্যবহার করে list()
এবং dict()
আপনার পাইথনকে সি উগের মতো দেখায়।
[] এবং তালিকার () এর মধ্যে পার্থক্যের ক্ষেত্রে, এমন একটি সমস্যা রয়েছে যা আমি অন্য কাউকে দেখায়নি। আপনি যদি তালিকার সদস্য হিসাবে অভিধান ব্যবহার করেন তবে দু'জন সম্পূর্ণ ভিন্ন ফলাফল দেবে:
In [1]: foo_dict = {"1":"foo", "2":"bar"}
In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]
In [3]: list(foo_dict)
Out [3]: ['1', '2']
[foo_dict]
ব্যবহার করে একই ফলাফল পেতে পারেন list((foo_dict,))
। list()
পদ্ধতি হিসাবে এটি শুধুমাত্র পরামিতি এবং iterates এটা লিস্টে উপাদান যোগ করার জন্য শেষ একটি iterable লাগে। এটি লিখিতভাবে list(some_list)
সমতল করে দেবে যা করে একই ধরণের ক্ষতি ঘটবে।
তালিকা () এবং [] আলাদাভাবে কাজ করুন:
>>> def a(p=None):
... print(id(p))
...
>>> for r in range(3):
... a([])
...
139969725291904
139969725291904
139969725291904
>>> for r in range(3):
... a(list())
...
139969725367296
139969725367552
139969725367616
তালিকা () সর্বদা স্তূপে নতুন অবজেক্ট তৈরি করে তবে []] অনেক কারণেই মেমরি সেল পুনরায় ব্যবহার করতে পারে।
নীচে শো হিসাবে উদাহরণ হিসাবে [] এবং তালিকার () এর মধ্যে আচরণের মধ্যে একটি পার্থক্য রয়েছে। আমাদের যদি সংখ্যার তালিকা ফেরত দিতে চান তবে আমাদের তালিকা ব্যবহার করতে হবে, অন্যথায় আমরা একটি মানচিত্রের অবজেক্টটি পাই! যদিও এটি ব্যাখ্যা করবেন তা নিশ্চিত নয়।
sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth)
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list
type(sth2[0]) # map
sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int
একটি বক্স ব্রাকেট জুটি তালিকার কোনও একটি বা একটি সূচক সাবস্ক্রিপ্ট, মাই_লিস্ট [এক্স] উল্লেখ করে।
একটি কোঁকড়া ধনুর্বন্ধনী জোড় একটি অভিধান অবজেক্টকে বোঝায়।
a_list = ['চালু', 'বন্ধ', 1, 2]
a_dict = {অন: 1, বন্ধ: 2
এটি বেশিরভাগ সময় প্রধানত পছন্দ করার বিষয়। এটা পছন্দসই বিষয়।
তবে খেয়াল করুন যে উদাহরণস্বরূপ যদি আপনার সংখ্যার কীগুলি থাকে তবে আপনি এটি করতে পারবেন না:
mydict = dict(1="foo", 2="bar")
তোমাকে করতে হবে:
mydict = {"1":"foo", "2":"bar"}
mydict = {1:"foo", 2:"bar"}
(কীগুলির জন্য উদ্ধৃতিবিহীন) করতে হবে।
list(i for i in range(10) if i % 2)