Skip to content

Commit aa12a60

Browse files
Update codeflash/context/unused_definition_remover.py
Co-authored-by: codeflash-ai[bot] <148906541+codeflash-ai[bot]@users.noreply.github.com>
1 parent 3e300fc commit aa12a60

File tree

1 file changed

+31
-21
lines changed

1 file changed

+31
-21
lines changed

codeflash/context/unused_definition_remover.py

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -551,40 +551,50 @@ def _analyze_imports_in_optimized_code(
551551
"""
552552
imported_names_map = defaultdict(set)
553553

554-
# Create a lookup of helper functions by their simple names and file paths
555-
helpers_by_name = defaultdict(list)
556-
helpers_by_file = defaultdict(list)
557-
554+
# Precompute a two-level dict: module_name -> func_name -> [helpers]
555+
helpers_by_file_and_func = defaultdict(dict)
556+
helpers_by_file = defaultdict(list) # preserved for "import module"
557+
helpers_append = helpers_by_file_and_func.setdefault
558558
for helper in code_context.helper_functions:
559-
if helper.jedi_definition.type != "class":
560-
helpers_by_name[helper.only_function_name].append(helper)
559+
jedi_type = helper.jedi_definition.type
560+
if jedi_type != "class":
561+
func_name = helper.only_function_name
561562
module_name = helper.file_path.stem
563+
# Cache function lookup for this (module, func)
564+
file_entry = helpers_by_file_and_func[module_name]
565+
if func_name in file_entry:
566+
file_entry[func_name].append(helper)
567+
else:
568+
file_entry[func_name] = [helper]
562569
helpers_by_file[module_name].append(helper)
563570

564-
# Analyze import statements in the optimized code
571+
# Optimize attribute lookups and method binding outside the loop
572+
helpers_by_file_and_func_get = helpers_by_file_and_func.get
573+
helpers_by_file_get = helpers_by_file.get
574+
565575
for node in ast.walk(optimized_ast):
566576
if isinstance(node, ast.ImportFrom):
567577
# Handle "from module import function" statements
568-
if node.module:
569-
module_name = node.module
570-
for alias in node.names:
571-
imported_name = alias.asname if alias.asname else alias.name
572-
original_name = alias.name
573-
574-
# Find helpers that match this import
575-
for helper in helpers_by_file.get(module_name, []):
576-
if helper.only_function_name == original_name:
577-
imported_names_map[imported_name].add(helper.qualified_name)
578-
imported_names_map[imported_name].add(helper.fully_qualified_name)
578+
module_name = node.module
579+
if module_name:
580+
file_entry = helpers_by_file_and_func_get(module_name, None)
581+
if file_entry:
582+
for alias in node.names:
583+
imported_name = alias.asname if alias.asname else alias.name
584+
original_name = alias.name
585+
helpers = file_entry.get(original_name, None)
586+
if helpers:
587+
for helper in helpers:
588+
imported_names_map[imported_name].add(helper.qualified_name)
589+
imported_names_map[imported_name].add(helper.fully_qualified_name)
579590

580591
elif isinstance(node, ast.Import):
581592
# Handle "import module" statements
582593
for alias in node.names:
583594
imported_name = alias.asname if alias.asname else alias.name
584595
module_name = alias.name
585-
586-
# For "import module" statements, functions would be called as module.function
587-
for helper in helpers_by_file.get(module_name, []):
596+
for helper in helpers_by_file_get(module_name, []):
597+
# For "import module" statements, functions would be called as module.function
588598
full_call = f"{imported_name}.{helper.only_function_name}"
589599
imported_names_map[full_call].add(helper.qualified_name)
590600
imported_names_map[full_call].add(helper.fully_qualified_name)

0 commit comments

Comments
 (0)