Skip to content

Instantly share code, notes, and snippets.

@abdullahkulcu
Created December 26, 2022 12:38
Show Gist options
  • Save abdullahkulcu/86bff501ce42c3f57c9a1de490299903 to your computer and use it in GitHub Desktop.
Save abdullahkulcu/86bff501ce42c3f57c9a1de490299903 to your computer and use it in GitHub Desktop.
Python Memoize Sample
import logging
from datetime import datetime
logger = logging.getLogger(__name__)
class Memoize:
def __init__(self, f):
self.func = f
self.mem_data = {}
self.timeout_data = {}
self.running_time = {
f.__name__: datetime.now()
}
def __call__(self, *args, **kwargs):
try:
cahce_timeout = self.get_cache_timeout(func_name=self.func.__name__)
current_time = datetime.now()
if self.func.__name__ in self.running_time:
method_time = self.running_time[self.func.__name__]
if args not in self.mem_data or (current_time - method_time).total_seconds() > cahce_timeout:
self.mem_data[args] = self.func(*args)
self.set_method_running_time(self.func.__name__, datetime.now())
else:
self.mem_data[args] = self.func(*args)
self.set_method_running_time(self.func.__name__, datetime.now())
return self.mem_data[args]
except Exception as e:
logger.error(e)
return self.func(*args)
def set_method_running_time(self, func_name, time):
try:
self.running_time[func_name] = time
except Exception as e:
logger.error(e)
@staticmethod
def get_cache_timeout(func_name:str):
try:
if func_name:
return self.timeout_data.get(func_name, 60 * 1440)
except Exception as e:
logger.error(e)
return 60 * 120 # default
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment