এই প্রশ্নে উল্লিখিত হিসাবে তালিকা-অনুধাবন list.append
হুডের নীচে ব্যবহার করে, সুতরাং এটি তালিকা-পুনরায় আকারের পদ্ধতিটিকে কল করবে, যা সামগ্রিকভাবে উত্থাপন করে ।
এটি নিজের কাছে প্রদর্শনের জন্য, আপনি প্রকৃতপক্ষে dis
বিচ্ছিন্নকরণকারীটি ব্যবহার করতে পারেন :
>>> code = compile('[x for x in iterable]', '', 'eval')
>>> import dis
>>> dis.dis(code)
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x10560b810, file "", line 1>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_NAME 0 (iterable)
8 GET_ITER
10 CALL_FUNCTION 1
12 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x10560b810, file "", line 1>:
1 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 8 (to 14)
6 STORE_FAST 1 (x)
8 LOAD_FAST 1 (x)
10 LIST_APPEND 2
12 JUMP_ABSOLUTE 4
>> 14 RETURN_VALUE
>>>
লক্ষ্য করুন LIST_APPEND
এর disassembly মধ্যে opcode <listcomp>
কোড অবজেক্ট। ডক্স থেকে :
LIST_APPEND (ঝ)
কল list.append(TOS[-i], TOS)
। তালিকা বোঝার বাস্তবায়ন করতে ব্যবহৃত হয়।
এখন, তালিকা-পুনরাবৃত্তি অপারেশনের জন্য, আমাদের যদি বিবেচনা করা হয় তবে কী চলছে তা সম্পর্কে আমাদের একটি ইঙ্গিত রয়েছে:
>>> import sys
>>> sys.getsizeof([])
64
>>> 8*10
80
>>> 64 + 80
144
>>> sys.getsizeof([None]*10)
144
সুতরাং, মনে হয় এটি সঠিকভাবে বরাদ্দ করতে সক্ষম হবে । উত্স কোডের দিকে তাকালে আমরা দেখতে পাই ঠিক এটি ঘটে:
static PyObject *
list_repeat(PyListObject *a, Py_ssize_t n)
{
Py_ssize_t i, j;
Py_ssize_t size;
PyListObject *np;
PyObject **p, **items;
PyObject *elem;
if (n < 0)
n = 0;
if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
return PyErr_NoMemory();
size = Py_SIZE(a) * n;
if (size == 0)
return PyList_New(0);
np = (PyListObject *) PyList_New(size);
যেমন, এখানে: size = Py_SIZE(a) * n;
। বাকি ফাংশনগুলি কেবল অ্যারে পূরণ করে।
144 == sys.getsizeof([]) + 8*10)
যেখানে 8 একটি পয়েন্টার মাপ।