@@ -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