رزرو مشاوره تلفنی تک جلسه‌ای با استاد رضوی
رزرو مشاوره تلفنی
کنکور کامپیوتر
0
اشتراک
 

مدیریت حافظه در پایتون

این صفحه عالی به آموزش نحوه مدیریت حافظه در پایتون پرداخته و عملیات تخصیص حافظه در پایتون و مدیریت حافظه‌ CPython و آبجکت‌های پایتون در حافظه را توضیح داده است

در این مقاله می‌خواهیم به مدیریت‌ کردن حافظه در زبان برنامه نویسی پایتون بپردازیم. اسکریپت‌های برنامه نویسی پایتون از سینتکس‌های ساده‌ای تشکیل شده است؛ اما با اجرا کردن هرکدام از این سینتکس‌ها، منطق عظیمی در پشت صحنه اجرا می‌شود. در ادامه می‌خواهیم به طور مفصل در این مورد بحث کنیم و دستورات انجام شده جهت مدیریت‌کردن حافظه را بررسی کنیم. زبان پایتون یک زبان محبوب و همه‌منظوره است که برای موارد مختلفی استفاده می‌شود؛ از جمله تحلیل داده، یادگیری ماشین، نوشتن برنامه‌های تحت وب و خیلی موارد دیگر، بنابراین مدیریت حافظه در پایتون نقش مهمی در عملکرد و پرفورمنس برنامه‌های نوشته شده با پایتون دارد. در زبان پایتون، عملیات مدیریت حافظه توسط Python Manager انجام می‌شود؛ در واقع این بخش مشخص می‌کند که چه موقع، داده‌های برنامه را وارد حافظه کند، به همین خاطر، برای نوشتن یک برنامه‌ی کارآمد نیاز داریم در مورد عملکرد این سیستم اطلاعات کافی داشته باشیم.

عملیات تخصیص حافظه در پایتون

تخصیص حافظه یکی از قسمت‌های مهم مدیریت حافظه برای توسعه‌دهندگان است. تخصیص فضای خالی به حافظه مجازی یا Virtual Memory بر عهده‌ی این بخش است؛ به طور کلی در حین اجرای برنامه‌های پایتون، 2 نوع تخصیص در حافظه‌ی مجازی وجود دارد:

  • تخصیص حافظه ایستا (Static Memory Allocation)
  • تخصیص حافظه پویا (Dynamic Memory Allocation)

تخصیص حافظه ایستا

تخصیص حافظه به صورت ایستا در زمان کامپایل یا تفسیر انجام می‌شود. تخصیص ایستا بیشتر برای زمانی است که از متغیرهای ساده مانند Int و String استفاده می‌کنیم و یک مقداری را به آنها تخصیص می‌دهیم. در زیر دو مثال ساده از این مورد را مشاهده می‌کنید:

x = 42    # تخصیص ایستا برای متغیر عدد صحیح با مقدار  42
name = "ali"   #تخصیص ایستا برای متغیر رشته ای با مقدار  ali

تخصیص حافظه پویا

در تخصیص حافظه‌ی پویا، تخصیص در حین اجرای برنامه و در زمان Runtime انجام می‌شود. در زبان پایتون، اکثر تخصیص‌ها به صورت پویا انجام می‌شود؛ به خصوص برای آبجکت‌های قابل تغییر (Mutable)، مانند لیست (List)، دیکشنری (Dict) و آبجکت‌های Custom. وقتی یک شئ از کلاسی ایجاد می‌شود، پایتون به صورت پویا به آن شئ، حافظه تخصیص می‌دهد و آدرس حافظه نیز ممکن است در روند اجرای برنامه نیز تغییر کند. نمونه‌ای از کد تخصیص پویا در زیر آمده است:

my_list = [1, 2, 3]
my_dict = {'a': 1, 'b': 2}

دوره برنامه نویسی پایتون

پایتون (Python) یا پایتان یک زبان برنامه نویسی چند منظوره و سطح بالاست که بطور بسیار گسترده ای مورد استفاده برنامه نویسان و غیر برنامه نویسان قرار می‌گیرد. پایتون در سال های اخیر به یکی از محبوب ترین زبان های برنامه نویسی در جهان تبدیل شده است.

چه چیزهایی در این دوره یاد می‌گیرید

دستورات کنترلی
ذخیره‌سازی و داده ساختارها
ذخیره‌سازی و داده ساختارها
حلقه‌ها
توابع در پایتون
مدیریت خطاها در پایتون
کار با فایل‌ها
شی گرایی
برنامه نویسی موازی و تردها

نمونه فیلم‌هایی از جلسات برنامه نویسی پایتون

چرا باید پایتون را یاد بگیریم؟

چه چیز هایی را قرار است در این دوره یاد بگیریم؟ و مروری بر تاریخچه پایتون

نصب پایتون اجرا کردن اولین خط کد

آماده سازی ویرایشگر VS Code آشنایی با سینتکس پایتون

آماده سازی مینی کندا + توابع پرینت و ماژول math

معرفی عملگرها و چرایی نیاز به کنترل جریان در برنامه نویسی

مفهوم داده ساختارها در پایتون

آشنایی با دیکشنری ها

آشنایی با حلقه ها

معرفی کلی توابع با مثال های متنوع

خطاها چی هستند؟

نحوه کار کردن با فایل و خواندن آن در مودهای مختلف

تاریخچه برنامه‌‎ نویسی

مفهوم شی‌گرایی

معرفی فرآیند Process - تفاوت فرآیند و برنامه

مرور کلی مباحث و حل یک تمرین پیرامون اعداد اول

چرا باید پایتون را یاد بگیریم؟
چه چیز هایی را قرار است در این دوره یاد بگیریم؟ و مروری بر تاریخچه پایتون
نصب پایتون اجرا کردن اولین خط کد
آماده سازی ویرایشگر VS Code آشنایی با سینتکس پایتون
آماده سازی مینی کندا + توابع پرینت و ماژول math
معرفی عملگرها و چرایی نیاز به کنترل جریان در برنامه نویسی
مفهوم داده ساختارها در پایتون
آشنایی با دیکشنری ها
آشنایی با حلقه ها
معرفی کلی توابع با مثال های متنوع
خطاها چی هستند؟
نحوه کار کردن با فایل و خواندن آن در مودهای مختلف
تاریخچه برنامه‌‎ نویسی
مفهوم شی‌گرایی
معرفی فرآیند Process - تفاوت فرآیند و برنامه
مرور کلی مباحث و حل یک تمرین پیرامون اعداد اول

زباله روب پایتون

در زبان پایتون، آبجکت‌هایی که مدتی است از آنها استفاده نشده، حذف می‌شوند تا فضای خالی حافظه بیشتر شود. این فرآیند که در آن آبجکت‌های غیرضروری حذف می‌شود، به اصطلاح زباله روبی یا Garbage Collection نام دارد و توسط سیستم Garbage Collector انجام می‌شود. Garbage Collector در زمان آغاز برنامه شروع به کار می‌کند و زمانی که تعداد ارجاع به یک آبجکت به صفر برسد، فعال می‌شود. وقتی ما یک نام جدید تعریف می‌کنیم یا آن را وارد دیکشنری یا Tuple می‌کنیم، مقدار شمارش ارجاع (Reference Count) زیاد می‌شود، حال اگر ما ارجاع به متغیر را به نحوی از بین ببریم (مثلا با تخصیص مقدار جدید) و یا صراحتاً آن را حذف کنیم، مقدار ارجاع آن کاهش می‌یابد، وقتی مقدار ارجاع به یک آبجکت، به صفر برسد، آن آبجکت حذف می‌شود. همان‌طور که گفته شد، پایتون به صورت پویا حافظه را به آبجکت‌ها اختصاص می‌دهد؛ این‌کار در ساختمان دادهای با نام هیپ (Heap) انجام می‌شود. حافظه‌ی هیپ، آبجکت‌ها و بقیه‌ی داده‌هایی که در برنامه مورد استفاده قرار می‌گیرد را در خود ذخیره می‌کند. مدیریت حافظه پایتون، مدیریت تخصیص و عدم تخصیص در حافظه‌ی هیپ را به وسیله‌ی توابع APIها مدیریت می‌کند.

آبجکت‌های پایتون در حافظه

اگر برنامه نویس پایتون هستید، احتمالاً می‌دانید که همه چیز در پایتون یک آبجکت است. یک آبجکت می‌تواند ساده باشد (مانند اعداد و رشته) و یا به صورت دیکشنری، لیست و یا کلاس‌های تعریف شده باشد. در پایتون نیاز به تعریف کردن نوع یا Type متغیر قبل از اجرای برنامه نداریم؛ همچنین به راحتی می‌توان به Garbage Collector دستور حذف یک آبجکت را داد. کد زیر را در نظر بگیرید:

a = 10
print(a)
 del a
print(a)

اگر برنامه‌ی بالا را اجرا کنید خروجی زیر را دریافت می‌کنید:

10
Traceback (most recent call last):
  File "", line 1, in
    print(x)
NameError : name 'a' is not defined

همان‌طور که مشاهده می‌کنید، با اجرای دستور Print اول، عدد 10 در خروجی چاپ شده است؛ اما با حذف آبجکت a در عبارت Print دومی یک خطا رخ داد که نتیجه می‌گیریم آبجکت مورد نظر حذف شده است. برخلاف زبان C و زبان C++‎ تمامی مراحل مربوط به زباله روبی در پایتون به صورت خودکار انجام می‌شود.

شمارش ارجاعات در پایتون

تکنیک مهمی که در مدیریت حافظه در پایتون وجود دارد، Reference Counting یا شمارش ارجاع است. در شمارش ارجاع مشخص می‌شود که چند بار بقیه‌ی آبجکت‌ها به آبجکت مورد نظر ارجاع داده‌اند. به ازای هر ارجاعی که به آبجکت داده می‌شود، شمارنده یک عدد افزایش پیدا می‌کند و برعکس، وقتی آن ارجاع حذف شد، شمارنده یک عدد کاهش پیدا می‌کند؛ زمانی که تعداد ارجاعات به صفر رسید، Python Manager آن آبجکت را حذف می‌کند. در ادامه یک مثال را مورد بررسی قرار می‌دهیم:

فرض کنید تعداد دو عدد متغیر و یا بیشتر در اختیار داریم که دارای مقادیر مساوی هستند؛ ماشین مجازی پایتون به جای این که یک آبجکت دیگر با مقدار مساوی درون هیپ ایجاد کند، از متغیر دومی، یک ارجاع به مقدار موجود در هیپ می‌دهد، این‌کار در مدیریت حافظه استفاده می‌شود و بسیار کارآمد است. کد زیر را در نظر بگیرید:

x = 20

وقتی عدد 20 به متغیر x تخصیص می‌یابد، یک آبجکت از نوع Integer یا عدد صحیح در حافظه‌ی هیپ ساخته می‌شود و ارجاعی از متغیر x به آن ایجاد می‌شود.

تخصیص مقدار 20 به متغیر x

اکنون کد زیر را در نظر بگیرید:

x = 20
y = x 

if id(x) == id(y):
    print("The variables x and y are referring  to the same object")
else:
    print("The variables x and y are not referring  to the same object")

در این کد وقتی عبارت y = x را نوشتیم، آبجکت y یک ارجاع به آبجکت مشترک با x می‌سازد؛ چرا که پایتون بررسی می‌کند و می‌بیند که در حال حاضر، مقدار مشترک یعنی 20 در هیپ وجود دارد. تصویر زیر، خلاصه این مطلب را نشان می‌دهد:

ارجاع متغیر y به مقدار متغیر x

اکنون اگر کد را اجرا کنیم، نتیجه به صورت زیر در خروجی چاپ می‌شود:

The variables x and y are referring to the same object

حالا به یک کد دیگر می‌پردازیم:

x = 20
y = x
x += 1
 
if id(x) == id(y):
    print("The variables x and y are referring  to the same object")
else:
    print("The variables x and y are not referring to the same object")

اگر کد بالا را اجرا کنیم، نتیجه به صورت زیر در خروجی نمایش داده می‌شود:

The variables x and y are not referring to the same object

در واقع کد خط سوم مقدار متغیر x را تغییر داده است و اکنون دیگر مقادیر دو متغیر x و y برابر نیستند و به مقادیر مختلفی ارجاع می‌دهند.

دو متغیر x و y مقدار متفاوتی دارند

نمونه فیلم‌های دوره‌های مهارتی

مدیریت حافظه‌ CPython

زبان پایتون به وسیله‌ی زبان برنامه نویسی C نوشته شده است. یکی از قسمت‌های مهم پایتون، CPython است. در این قسمت می‌خواهیم معماری حافظه CPython را مورد بررسی قرار دهیم. برنامه‌های پایتون از حافظه‌ی مجازی‌ای استفاده می‌کند که توسط سیستم عامل ایجاد شده است. زبان پایتون از یک قسمت از حافظه برای مصارف داخلی و موارد غیرآبجکتی استفاده می‌کند و قسمت دیگر آن هم برای ذخیره‌ی آبجکت‎ها مانند دیکشنری، لیست و... مورد استفاده قرار می‌گیرد. CPython دارای یک تخصیص‌دهنده‎ی (Allocator) آبجکت است که مسئول تخصیص حافظه در حوزه‎ی آبجکت‌ها (Object Area) است. زمانی که یک آبجکت به فضا نیاز داشت، این تخصیص‌دهنده صدا زده می‌شود؛ همچنین، این تخصیص‌دهنده تنها برای داده‌های کوچک طراحی شده است؛ زیرا پایتون قادر نیست داده‌های حجیم را یکباره کنترل کند و تنها تخصیص حافظه در موارد ضروری انجام می‌شود. استراتژی تخصیص حافظه‌ CPython از سه قسمت مهم تشکیل شده است:

  • Arena
  • Pool
  • Block

معماری حافظه CPython

Pools

Poolها از اجزای اصلی الگوریتم مدیریت حافظه هستند. Poolها از بلاک‌هایی از یک کلاس با اندازه‌ی منحصربه‌فرد تشکیل شده‌اند و به وسیله‌ی یک لیست پیوندی دوگانه (Double-Linked List) به همدیگر متصل شده‌اند. این ساختار اجازه می‌دهد تا الگوریتم‌ها به راحتی بتوانند فضای خالی برای یک بلاک با سایز مشخص را پیدا کنند؛ حتی بین Poolهای مختلف. هر Pool می‌تواند دارای 3 وضعیت باشد: Full و Used و Empty. در وضعیت Used، برای داده‌ها بلاک‌های خالی وجود دارد، در حالت Full، تمامی بلاک‌ها به داده‌ها تخصیص داده شده‌اند و دیگر فضایی نمانده؛ در حالی که در وضعیت Empty، هیچ داده‌ای در Pool ذخیره نشده است.

Blocks

همان‌طور که گفته شد، درون هر Pool تعدادی بلاک وجود دارد، هر بلاک نیز دارای 3 وضعیت می‌باشد: Untouched و Free و Allocated، هدف تخصیص‌دهنده‌ای که پیش‌تر معرفی کردیم، این است که به حافظه دست نزند (مگر در موارد ضروری).

Arenas

به طور ساده Arena یک نگهدارنده (Container) برای Pool است که در یک لیست پیوندی دو طرفه به نام Usable_Arenas قرار گرفته است. این لیست براساس تعداد Poolهای خالی مرتب شده است؛ به این معنا که Arenaای که کمترین Pool خالی را دارد در جلوی لیست قرار می‌گیرد. برخلاف Poolها، Arenaها وضعیت‌های مختلفی ندارند. با این سیستم اولویت‌بندی نسبتاً ساده، مطمئن می‌شویم که بلاک‌های حافظه به طور کارآمد تخصیص داده می‌شود.

دوره‌های مهارتی رشته کامپیوتر

جمع‌بندی

مدیریت حافظه یکی از تکنیک‌های مهم در زبان های برنامه نویسی می‌باشد. از آن‌جایی که سینتکس‌های زبان پایتون بسیار ساده هستند و اکثر کارها به صورت خودکار انجام می‌شود، در نتیجه، سیستم مدیریت حافظه در پایتون دارای معماری و ساختار پیچیده‌ای است، با این‌حال، برنامه‌نویسان نیاز به کار خاصی برای مدیریت‌ کردن حافظه ندارند و تنها رعایت بعضی از مسائل کدنویسی کافی می‌باشد. در این مقاله به بررسی تکنیک‌ها و اجزای مهم مدیریت حافظه در زبان پایتون پرداختیم و نکات مهم مربوط به مدیریت حافظه را ذکر کردیم.

منظور از مدیریت حافظه در پایتون چیست؟

مدیریت حافظه در پایتون به فرایند تخصیص کارآمد حافظه و مدیریت آبجکت‌ها به وسیله‌ی Python Memory Management گفته می‌شود. تمامی عملیات مربوط به تخصیص و عدم تخصیص حافظه در پایتون به وسیله‌ی این بخش انجام می‌شود.

آیا مدیریت حافظه در پایتون به صورت دستی انجام می‌شود؟

خیر، مدیریت حافظه در پایتون به وسیله‌ی Python Manager و ابزارهایی مانند Garbage Collector انجام می‌شود، هرچند که برنامه‌نویسان به صورت دستی می‌توانند در کار زباله روبی دست داشته باشند.

امتیازدهی4.51111111111امتیاز 4.50(5 امتیاز)
اشتراک
تلگرام اینستاگرام تماس با پشتیبانی: 09378555200 تماس با پشتیبانی: 09378555200
خدمات ما پشتیبانی کنکور کامپیوتر

سؤالی داری؟ از هر راهی که راحت‌تری.

تماس با پشتیبانی۰۹۳۷۸۵۵۵۲۰۰ پشتیبانی در تلگرامپاسخ‌گویی پیامی کانال تلگراماخبار و اطلاعیه‌ها اینستاگرامkonkurcomputer.ir
اشتراک‌گذاری این مطلب

مدیریت حافظه در پایتون

تلگرام واتس‌اپ ایکس
https://www.konkurcomputer.ir/مدیریت-حافظه-در-پایتون.html
خدمات کنکور کامپیوتر
هر چیزی که برای قبولی لازم داری، یک‌جاخدمات ما

از مشاوره‌ی شخصی با استاد رضوی تا فیلم‌های دروس، پلتفرم‌ها و ابزارهای رایگان

مشاوره‌ی شخصی با استاد رضوی
تماس با پشتیبانی