مدیریت حافظه و بهینه‌سازی کد در پایتون

ایجاد شده توسط دکتر مصطفی جلیلی در آموزش برنامه نویسی پایتون 8 مارس 2025
اشتراک گذاری

در برنامه‌نویسی پایتون، مدیریت حافظه و بهینه‌سازی کد نقش بسیار مهمی دارند. این موضوعات می‌توانند تأثیر بسزایی بر عملکرد برنامه‌های ما داشته باشند. در این جزوه، به بررسی مفهوم Garbage Collection، مدیریت حافظه با del، بهینه‌سازی با Generators و yield، و کاربرد Decorators می‌پردازیم.




مفهوم Garbage Collection در پایتون


Garbage Collection (جمع‌آوری زباله) در پایتون به فرآیند مدیریت حافظه و حذف خودکار اشیای غیرقابل دسترس گفته می‌شود. پایتون دارای یک مدیریت خودکار حافظه است که به کمک Reference Counting و Garbage Collector (GC) کار می‌کند.


الف) Reference Counting (شمارش مراجع)


هر شیء در پایتون یک شمارنده دارد که تعداد مراجعات به آن را نگه می‌دارد. زمانی که این شمارنده صفر شود، حافظه آن شیء آزاد می‌شود.


مثال:


import sys

x = [] # لیست خالی ایجاد می‌کنیم
print(sys.getrefcount(x)) # تعداد ارجاعات به x را چاپ می‌کنیم


ب) استفاده از Garbage Collector


ما می‌توانیم GC را به‌صورت دستی کنترل کنیم:


import gc
gc.collect() # اجرای دستی Garbage Collection

اگر بخواهیم GC را غیرفعال کنیم:


gc.disable()

و برای فعال‌سازی دوباره:


gc.enablle()

مدیریت حافظه با del


پایتون اجازه می‌دهد که متغیرها را به صورت دستی از حافظه حذف کنیم:


x = [1, 2, 3]
del x # حذف x از حافظه

این دستور باعث می‌شود که شمارنده‌ی مرجع (Reference Count) برای x صفر شده و جمع‌آوری زباله آن را از بین ببرد.


نکته: استفاده نادرست از del می‌تواند باعث ایجاد خطاهای پیش‌بینی‌نشده شود.


بهینه‌سازی مصرف حافظه با Generators و yield


گاهی اوقات حجم داده‌های ما زیاد است و استفاده از لیست‌های بزرگ باعث مصرف زیاد حافظه می‌شود. در چنین مواردی از Generators استفاده می‌کنیم.


تفاوت Generator با لیست:


# لیست معمولی
numbers = [i for i in range(1000000)] # مصرف حافظه زیاد

# Generator
numbers_gen = (i for i in range(1000000)) # مصرف حافظه کم

مثال استفاده از yield در Generator:


def number_generator():
n = 0
while True:
yield n # مقدار n را برمی‌گرداند ولی حافظه را اشغال نمی‌کند
n += 1
num_gen = number_generator()
print(next(num_gen)) # 0
print(next(num_gen)) # 1
print(next(num_gen)) # 2

مزایای Generators:



  • کاهش مصرف حافظه

  • مناسب برای پردازش داده‌های بزرگ

  • افزایش عملکرد


Decorators و استفاده از آن‌ها


Decorators توابعی هستند که به ما امکان می‌دهند رفتار توابع دیگر را بدون تغییر کد اصلی، اصلاح کنیم.


مثال ساده Decorator:


def my_decorator(func):
def wrapper():
print("قبل از اجرای تابع")
func()
print("بعد از اجرای تابع")
return wrapper
@my_decorator
def say_hello():
print("سلام")
say_hello()

خروجی:


قبل از اجرای تابع
سلام
بعد از اجرای تابع

کاربردهای Decorators


  • ثبت زمان اجرای تابع:


import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"مدت زمان اجرا: {end_time - start_time} ثانیه")
return result
return wrapper
@timing_decorator
def example():
time.sleep(1)
print("اجرای تابع")
example()

جمع‌بندی


در این جزوه، با مفاهیم زیر آشنا شدیم:



  1. Garbage Collection و مدیریت خودکار حافظه در پایتون

  2. مدیریت حافظه با del

  3. بهینه‌سازی حافظه با Generators و yield

  4. کاربرد Decorators و سفارشی‌سازی توابع



نظرات (0)

اشتراک گذاری

این پست را با دیگران به اشتراک بگذارید

تنظیمات GDPR

When you visit any of our websites, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and manage your preferences. Please note, that blocking some types of cookies may impact your experience of the site and the services we are able to offer.