یک دکوراتور در پایتون بنویسید که با استفاده از functools.wraps نتایج توابع عددی را در یک کش ذخیره (memoize) کند تا فراخوانیهای بعدی با همان آرگومانها فوراً نتیجهٔ ذخیرهشده را برگردانند.
3.0 بازدید آخرین ویرایش در 221 روز قبل ساعت 01:39 0.0
برای حل: از functools.wraps برای حفظ __name__ و docstring تابع اصلی استفاده کنید، یک دیکشنری ساده بهعنوان کش نگه دارید و کلید را از tuple(args) و یک tuple مرتب از kwargs.items() بسازید. در صورت وجود کلید، مقدار کششده را برگردانید و در غیر این صورت تابع را صدا بزنید، نتیجه را در کش ذخیره کنید و سپس برگردانید. نکات: این روش برای آرگومانهای قابل هش (hashable) مناسب است؛ برای آرایههای numpy باید آنها را به شکل قابل هش تبدیل کنید یا از شناسهٔ بایت/هش استفاده کنید؛ این دکوراتور در محاسبات عددی و اسکریپتهای خودکار که محاسبات تکراری دارند بسیار مفید است.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
این دکوراتور با استفاده از wraps نتیجهٔ توابع عددی را کش میکند تا فراخوانیهای مجدد با همان آرگومانها سریع باشند. کلید کش از ترکیبی از tuple(args) و مرتبشدهٔ kwargs ساخته میشود و اگر کلید وجود داشت مقدار کششده برگردانده میشود و در غیر این صورت تابع اجرا شده، نتیجه در کش ذخیره میشود. نکتهٔ مهم این است که این روش برای آرگومانهای قابل هش (hashable) مناسب است؛ برای آرایههای numpy باید به صورت قابل هش تبدیل شوند (مثلاً بهbytes) یا از هش/شناختهشدن با id استفاده کرد. همچنین در محاسبات طولانی یا با دادههای بزرگ، کش میتواند حافظه را مصرف کند، پس ممکن است بخواهید محدودکردن اندازهٔ کش یا استفاده از functools.lru_cache را در نظر بگیرید.
گزارش