پاسخ سوال تستی:
وقتی ما عبارت :
A = [1, 2, 3]
رو مینویسیم ، پایتون میدونه که دقیقا این لیست شامل 3 تا آبجکت هست پس به همین مقدار فضا براش توی مموری اختصاص میده.
حالا فرض کنید ما لیست خالی b رو داریم ، وقتی که یک آیتم بهش اضافه میکنیم پایتون مجبور هست تا اون فضایی که برای اون لیست اختصاص داده رو گسترش بده تا بتونه آیتم جدید رو اضافه کنه. دوباره آیتم جدید به همین ترتیب.
اتفاقی که میفته اینکه این کار خیلی هزینه بره که به ازای هر بار اضافه کردن یه آیتم نیاز باشه تا لیست ما اول بزرگ شه بعد آیتم جا بگیره داخلش.
برای حل این مشکل پایتون میگه موقع اضافه کردن آیتم اول بیایم یه تعداد بیشتری فضای خالی ایجاد کنیم به اصطلاح pre-allocating انجام بدیم تا وقتی آیتم های بعدی خواستن اضافه بشن فقط اضافه بشن و دوباره نیاز به بزرگ شدن لیست نباشه.
حالا سوال پیش میاد که خب اینکار خوبه ؟ ما یه عضو اضافه کردیم ولی به اندازه n عضو لیستمون بزرگ شده. سرعت یا حافظه مسئله این است ! یه چیزه میانه ، طبق سورس کد پایتون که لینکشو میزارم :
The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...

جالبه بدونین توی list-comprehension هم دقیقا همین اتفاق میفته.

پ.ن : این جزئیات پیاده سازی مربوط به Cpython هست از دیگر implementaion های پایتون نظیر pypy ، Jython و ... اطلاعی ندارم.

https://github.com/python/cpython/blob/3.5/Objects/listobject.c#L42

@raspberry_python

Comments

Be the first to add a comment