🔹این دکوراتور مثل یک سیستم کشینگ (Caching) درونبرنامهای عمل میکنه و نتایج توابع سنگین یا محاسباتی رو ذخیره میکنه تا توی اجراهای بعدی با همون ورودی، بدون محاسبات مجدد و در صدمثانیه نتیجه رو برگردونه!
🔹 بدون کشینگ (کند و اجرای مجدد محاسبات):
import time
def get_user_data(user_id):
# فرض کنید این تابع به دیتابیس وصل میشه و ۲ ثانیه طول میکشه
time.sleep(2)
return f"User Data for ID: {user_id}"
# هر بار فراخوانی ۲ ثانیه زمان میبره
print(get_user_data(101)) # 2 seconds
print(get_user_data(101)) # 2 seconds (دوباره همان زمان!)
🔹 با lru_cache (بهینهسازی فوقالعاده با اضافه کردن ۱ خط):
from functools import lru_cache
import time
@lru_cache(maxsize=128) # حداکثر ۱۲۸ نتیجه اخیر را کش میکند
def get_user_data(user_id):
time.sleep(2)
return f"User Data for ID: {user_id}"
print(get_user_data(101)) # اجرا میشه (۲ ثانیه)
print(get_user_data(101)) # آنی و بدون معطلی برمیگرده! (0.00 seconds)
🔹 نکات کلیدی:
. پارامتر maxsize: ظرفیت کش را مشخص میکند (None یعنی بدون محدودیت).
. شرط مهم: آرگومانهای تابعی که دکوراتور @lru_cache میگیرد باید Hashable باشند (مثل string, int, tuple) نه لیست یا دیکشنری.
. کاربرد: فراخوانیهای مکرر API، محاسبات سنگین ریاضی، یا کوئریهای ثابت دیتابیس.
🔹 بونس: اگر خواستید کش را به صورت دستی خالی کنید:
get_user_data.cache_clear()
🐍 @python_rd