From e240c6bdf804bcbc4ac8b0fdb7b91eaed7b2cf1a Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 7 May 2024 12:36:44 +0530 Subject: [PATCH] perf: Avoid caching `module_app` (#26349) module_app is just reverse of app_module. This saves ~1.5% of overhead. --- frappe/__init__.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 233b28d54c..f90c5bd020 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -1717,34 +1717,37 @@ def setup_module_map(include_all_apps: bool = True) -> None: """ if include_all_apps: local.app_modules = cache.get_value("app_modules") - local.module_app = cache.get_value("module_app") else: local.app_modules = cache.get_value("installed_app_modules") - local.module_app = cache.get_value("module_installed_app") - if not (local.app_modules and local.module_app): - local.module_app, local.app_modules = {}, {} + if not local.app_modules: + local.app_modules = {} if include_all_apps: apps = get_all_apps(with_internal_apps=True) else: apps = get_installed_apps(_ensure_on_bench=True) + for app in apps: local.app_modules.setdefault(app, []) for module in get_module_list(app): module = scrub(module) - if module in local.module_app: - print( - f"WARNING: module `{module}` found in apps `{local.module_app[module]}` and `{app}`" - ) - local.module_app[module] = app local.app_modules[app].append(module) if include_all_apps: cache.set_value("app_modules", local.app_modules) - cache.set_value("module_app", local.module_app) else: cache.set_value("installed_app_modules", local.app_modules) - cache.set_value("module_installed_app", local.module_app) + + # Init module_app (reverse mapping) + local.module_app = {} + for app, modules in local.app_modules.items(): + for module in modules: + if module in local.module_app: + warnings.warn( + f"WARNING: module `{module}` found in apps `{local.module_app[module]}` and `{app}`", + stacklevel=1, + ) + local.module_app[module] = app def get_file_items(path, raise_not_found=False, ignore_empty_lines=True):