আপাতদৃষ্টিতে সামগ্রিকভাবে কিছু list(a)
হয় না, [x for x in a]
সামগ্রিকভাবে কিছু পয়েন্টে ওভারকোলেট হয় এবং সার্বক্ষণিকভাবে[*a]
সামগ্রিকভাবে থাকে ?
এখানে 0 থেকে 12 পর্যন্ত আকারের এন এবং ফলস্বরূপ আকারগুলি তিনটি পদ্ধতির জন্য বাইটে রয়েছে:
0 56 56 56
1 64 88 88
2 72 88 96
3 80 88 104
4 88 88 112
5 96 120 120
6 104 120 128
7 112 120 136
8 120 120 152
9 128 184 184
10 136 184 192
11 144 184 200
12 152 184 208
এরকম গণনা করা হয়েছে , repl.it এ পুনরুত্পাদনযোগ্য , পাইথন ৩ ব্যবহার করে 8 :
from sys import getsizeof
for n in range(13):
a = [None] * n
print(n, getsizeof(list(a)),
getsizeof([x for x in a]),
getsizeof([*a]))
তাহলে এটা কিভাবে কাজ করে? [*a]
সামগ্রিকভাবে কীভাবে হয় ? আসলে, প্রদত্ত ইনপুট থেকে ফলাফল তালিকা তৈরি করতে এটি কোন প্রক্রিয়া ব্যবহার করে? এটি কি পুনরুক্তি ব্যবহার করে a
এবং এর মতো কিছু ব্যবহার করে list.append
? সোর্স কোডটি কোথায়?
( ডেটা এবং কোড সহ কোলাব যা চিত্রগুলি তৈরি করে))
ছোট এন এ জুম করা:
বড় এন থেকে জুম করা:
list(a)
সম্পূর্ণ সিতে পরিচালনা করে; এটি পুনরাবৃত্ত হওয়ার সাথে সাথে নোড দ্বারা অভ্যন্তরীণ বাফার নোড বরাদ্দ করতে পারে a
। [x for x in a]
কেবলমাত্র LIST_APPEND
প্রচুর ব্যবহার করে , তাই এটি "সাধারণভাবে কিছুটা ওভারটলোকট, যখন প্রয়োজন তখন পুনরায় ডেকে আনে" একটি সাধারণ তালিকার প্যাটার্ন অনুসরণ করে। [*a]
ব্যবহার করে BUILD_LIST_UNPACK
, যা ... আমি জানি না যে এটি কি করে, সমস্ত সময় দৃশ্যত অতিরিক্ত বরাদ্দ ব্যতীত :)
list(a)
এবং [*a]
অভিন্ন, এবং উভয়ের তুলনায় সামগ্রিকভাবে কাজ করা হয় [x for x in a]
, সুতরাং ... sys.getsizeof
এখানে ব্যবহারের সঠিক সরঞ্জাম নাও হতে পারে।
sys.getsizeof
সঠিক সরঞ্জাম, এটি কেবল দেখায় যে সামগ্রিকভাবে list(a)
ব্যবহৃত হয়। আসলে কি নতুন পাইথন 3.8 এটা উল্লেখ: "তালিকা কন্সট্রাকটর overallocate না [...] করে" ।
[*a]
হিসাবে আচরণ করে , যখনextend
খালি তালিকায় ব্যবহার করার মতো আচরণ করে ।