Garbage Collection (جمعآوری زباله) در پایتون به فرآیند مدیریت حافظه و حذف خودکار اشیای غیرقابل دسترس گفته میشود. پایتون دارای یک مدیریت خودکار حافظه است که به کمک Reference Counting و Garbage Collector (GC) کار میکند.
الف) Reference Counting (شمارش مراجع)
هر شیء در پایتون یک شمارنده دارد که تعداد مراجعات به آن را نگه میدارد. زمانی که این شمارنده صفر شود، حافظه آن شیء آزاد میشود.
مثال:
import sysx = [] # لیست خالی ایجاد میکنیم
print(sys.getrefcount(x)) # تعداد ارجاعات به x را چاپ میکنیم
ب) استفاده از Garbage Collector
ما میتوانیم GC را بهصورت دستی کنترل کنیم:
import gcgc.collect() # اجرای دستی Garbage Collection
اگر بخواهیم GC را غیرفعال کنیم:
gc.disable()
و برای فعالسازی دوباره:
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 = 0while True:yield n # مقدار n را برمیگرداند ولی حافظه را اشغال نمیکندn += 1num_gen = number_generator()print(next(num_gen)) # 0print(next(num_gen)) # 1print(next(num_gen)) # 2
مزایای Generators:
Decorators و استفاده از آنهاDecorators توابعی هستند که به ما امکان میدهند رفتار توابع دیگر را بدون تغییر کد اصلی، اصلاح کنیم.
مثال ساده Decorator:
def my_decorator(func):def wrapper():print("قبل از اجرای تابع")func()print("بعد از اجرای تابع")return wrapper@my_decoratordef say_hello():print("سلام")say_hello()
خروجی:
قبل از اجرای تابع
سلام
بعد از اجرای تابع
کاربردهای Decorators
import timedef 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 resultreturn wrapper@timing_decoratordef example():time.sleep(1)print("اجرای تابع")example()
در این جزوه، با مفاهیم زیر آشنا شدیم:
delGenerators و yieldDecorators و سفارشیسازی توابع