در این مقاله میخواهیم به مدیریت کردن حافظه در زبان برنامه نویسی پایتون بپردازیم. اسکریپتهای برنامه نویسیبرنامه نویسی کامپیوتر چیست و چطور می توانید یک برنامه نویس موفق شوید؟در عصر فعلی برنامهنویسی یکی از پرطرفدارترین شغلهای دنیاست، دغدغهای افرادی که میخواهند در مسیر برنامهنویس شدن قدم بردارند این است که نمیدانند از کجا باید شروع کنند، در این صفحه هر آن چه برای تبدیل شدن به یک برنامه نویس حرفه ای نیاز دارید در اختیارتان قرار گرفته است پایتونزبان برنامه نویسی پایتون چیست؟ – نحوه شروع و دلایل محبوبیتزبان برنامه نویسی پایتون (Python) چیست؟ این مقاله عالی به بررسی دلایل محبوبیت پایتون، موارد استفاده از پایتون و نحوه شروع به برنامه نویسی پایتون پرداخته از سینتکسهای سادهای تشکیل شده است؛ اما با اجرا کردن هرکدام از این سینتکسها، منطق عظیمی در پشت صحنه اجرا میشود. در ادامه میخواهیم به طور مفصل در این مورد بحث کنیم و دستورات انجام شده جهت مدیریتکردن حافظهحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوتردر این مقاله به بررسی کامل حافظه در کامپیوتر، انواع حافظه در کامپیوتر، کش، روشهای آدرس دهی کش، نگاشت آدرس و موارد دیگر میپردازیم را بررسی کنیم. زبان پایتون یک زبان محبوب و همهمنظوره است که برای موارد مختلفی استفاده میشود؛ از جمله تحلیل داده، یادگیری ماشینیادگیری ماشین چیست و چرا مهم است؟ - Machine learning (ML)تعریف یادگیری ماشین : ماشین لرنینگ (Machine Learning یا به اختصار ML) باعث میشود که خود ماشینها با آنالیز داده ها امکان یادگیری و پیشرفت داشته باشند، این مقاله فوق العاده یادگیری ماشین را بصورت کامل بررسی کرده است، نوشتن برنامههای تحت وب و خیلی موارد دیگر، بنابراین مدیریت حافظه در پایتون نقش مهمی در عملکرد و پرفورمنس برنامههای نوشته شده با پایتون دارد. در زبان پایتون، عملیات مدیریت حافظه توسط 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}
دوره برنامه نویسی پایتون
نمونه فیلمهایی از جلسات برنامه نویسی پایتون
زباله روب پایتون
در زبان پایتون، آبجکتهایی که مدتی است از آنها استفاده نشده، حذف میشوند تا فضای خالی حافظه بیشتر شود. این فرآیند که در آن آبجکتهای غیرضروری حذف میشود، به اصطلاح زباله روبی یا Garbage CollectionGarbage Collection(GC) چیست و چگونه کار میکند؟این مقاله عالی بررسی کرده که Garbage Collection(GC) چیست و چگونه کار میکند؟ و مزایای Garbage Collection و انواع روش های Garbage Collection را معرفی کرده نام دارد و توسط سیستم Garbage Collector انجام میشود. Garbage Collector در زمان آغاز برنامه شروع به کار میکند و زمانی که تعداد ارجاع به یک آبجکت به صفر برسد، فعال میشود. وقتی ما یک نام جدید تعریف میکنیم یا آن را وارد دیکشنری یا Tupleتاپل در پایتون چیست؟ ⚡️تعریف و آموزش تاپل در پایتوناین مقاله عالی به معرفی و تعریف تاپل در پایتون پرداخته سپس آموزش تاپیل، کاربرد تاپل در پایتون، انواع تاپل در پایتون، بسته بندی تاپل و عملیات روی تاپل را گفته میکنیم، مقدار شمارش ارجاع (Reference Count) زیاد میشود، حال اگر ما ارجاع به متغیر را به نحوی از بین ببریم (مثلا با تخصیص مقدار جدید) و یا صراحتاً آن را حذف کنیم، مقدار ارجاع آن کاهش مییابد، وقتی مقدار ارجاع به یک آبجکت، به صفر برسد، آن آبجکت حذف میشود. همانطور که گفته شد، پایتون به صورت پویا حافظه را به آبجکتها اختصاص میدهد؛ اینکار در ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده استای با نام هیپدرخت هیپ (heap) چیست؟ آموزش هیپ در ساختمان دادهاین صفحه عالی به آموزش هیپ (heap) در ساختمان داده پرداخته و اعمالی که در هرم قابل انجام است و مزایا و معایب حافظه Heap و مثال کدنویسی از Heap را آورده (Heap) انجام میشود. حافظهی هیپ، آبجکتها و بقیهی دادههایی که در برنامه مورد استفاده قرار میگیرد را در خود ذخیره میکند. مدیریت حافظه پایتون، مدیریت تخصیص و عدم تخصیص در حافظهی هیپ را به وسیلهی توابع APIAPI چیست؟ همه چیز درباره api یا رابط برنامه نویسی کاربردیاین مقاله عالی بررسی کرده که API چیست و چه کاربردی دارد و چگونه می توان از api ها در برنامه های خود استفاده نمود. همچنین استاندارد api و کاربرد api بررسی شدهها مدیریت میکند.
آبجکتهای پایتون در حافظه
اگر برنامه نویس پایتون هستید، احتمالاً میدانید که همه چیز در پایتون یک آبجکت است. یک آبجکت میتواند ساده باشد (مانند اعداد و رشتهرشته یا String چیست ⚡️ نحوه کار با استرینگ در برنامه نویسیاین مقاله به معرفی رشته (String) یا استرینگ در برنامه نویسی، رشته در پایتون، رشته در C++ و همین طور الگوریتمهای معروف مربوط به رشته ها در برنامه نویسی پرداخته ) و یا به صورت دیکشنری، لیست و یا کلاسهای تعریف شده باشد. در پایتون نیاز به تعریف کردن نوع یا 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 – مزایا و کاربرد زبان C – فرق C و ++Cاین مقاله عالی ابتدا توضیح میدهد که زبان برنامه نویسی c چیست، سپس به بررسی مزایا و معایب زبان C ، کاربردهای زبان سی ، و تفاوت بین C و ++C میپردازد و زبان C++برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده تمامی مراحل مربوط به زباله روبی در پایتون به صورت خودکار انجام میشود.
شمارش ارجاعات در پایتون
تکنیک مهمی که در مدیریت حافظه در پایتون وجود دارد، Reference Counting یا شمارش ارجاع است. در شمارش ارجاع مشخص میشود که چند بار بقیهی آبجکتها به آبجکت مورد نظر ارجاع دادهاند. به ازای هر ارجاعی که به آبجکت داده میشود، شمارنده یک عدد افزایش پیدا میکند و برعکس، وقتی آن ارجاع حذف شد، شمارنده یک عدد کاهش پیدا میکند؛ زمانی که تعداد ارجاعات به صفر رسید، Python Manager آن آبجکت را حذف میکند. در ادامه یک مثال را مورد بررسی قرار میدهیم:
فرض کنید تعداد دو عدد متغیر متغیر در برنامه نویسی چیست ⚡️انواع متغیر در برنامه نویسیاین صفحه عالی بررسی کرده متغیر در برنامه نویسی چیست و انواع متغیر در برنامه نویسی را معرفی و مراحل کار با متغیر، نحوه تعریف و قوانین نامگذاری متغیرها را گفته و یا بیشتر در اختیار داریم که دارای مقادیر مساوی هستند؛ ماشین مجازی پایتون به جای این که یک آبجکت دیگر با مقدار مساوی درون هیپ ایجاد کند، از متغیر دومی، یک ارجاع به مقدار موجود در هیپ میدهد، اینکار در مدیریت حافظه استفاده میشود و بسیار کارآمد است. کد زیر را در نظر بگیرید:
x = 20
وقتی عدد 20 به متغیر x تخصیص مییابد، یک آبجکت از نوع Integer یا عدد صحیح در حافظهی هیپ ساخته میشود و ارجاعی از متغیر 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 در هیپ وجود دارد. تصویر زیر، خلاصه این مطلب را نشان میدهد:
اکنون اگر کد را اجرا کنیم، نتیجه به صورت زیر در خروجی چاپ میشود:
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 برابر نیستند و به مقادیر مختلفی ارجاع میدهند.
نمونه فیلمهای دورههای مهارتی
مدیریت حافظه CPython
زبان پایتون به وسیلهی زبان برنامه نویسی C زبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cاین مقاله عالی ابتدا توضیح میدهد که زبان برنامه نویسی c چیست، سپس به بررسی مزایا و معایب زبان C ، کاربردهای زبان سی ، و تفاوت بین C و ++C میپردازد نوشته شده است. یکی از قسمتهای مهم پایتون، CPython است. در این قسمت میخواهیم معماری حافظه CPython را مورد بررسی قرار دهیم. برنامههای پایتون از حافظهی مجازیای استفاده میکند که توسط سیستم عاملسیستم عامل چیست به زبان ساده، چرا باید از OS استفاده کنیم؟این مقاله عالی به معرفی سیستم عامل (Operating System|OS) به زبان ساده پرداخته، همچنین بررسی کرده که چرا باید از سیستم عامل استفاده کنیم ایجاد شده است. زبان پایتون از یک قسمت از حافظه برای مصارف داخلی و موارد غیرآبجکتی استفاده میکند و قسمت دیگر آن هم برای ذخیرهی آبجکتها مانند دیکشنری، لیست و... مورد استفاده قرار میگیرد. CPython دارای یک تخصیصدهندهی (Allocator) آبجکت است که مسئول تخصیص حافظه در حوزهی آبجکتها (Object Area) است. زمانی که یک آبجکت به فضا نیاز داشت، این تخصیصدهنده صدا زده میشود؛ همچنین، این تخصیصدهنده تنها برای دادههای کوچک طراحی شده است؛ زیرا پایتون قادر نیست دادههای حجیم را یکباره کنترل کند و تنها تخصیص حافظه در موارد ضروری انجام میشود. استراتژی تخصیص حافظه CPython از سه قسمت مهم تشکیل شده است:
- Arena
- Pool
- Block
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 انجام میشود، هرچند که برنامهنویسان به صورت دستی میتوانند در کار زباله روبی دست داشته باشند.