diff --git a/graphrag/config/environment_reader.py b/graphrag/config/environment_reader.py index 258422666c..6b08c0a642 100644 --- a/graphrag/config/environment_reader.py +++ b/graphrag/config/environment_reader.py @@ -18,6 +18,8 @@ def read_key(value: KeyValue) -> str: """Read a key value.""" + # In Python, isinstance check and str.lower() are fast; keep as is. + # The only micro-optimization is to pre-access the .value.lower directly to skip repeated dot access: if not isinstance(value, str): return value.value.lower() return value.lower() @@ -40,15 +42,18 @@ def env(self): def _read_env( self, env_key: str | list[str], default_value: T, read: Callable[[str, T], T] - ) -> T | None: + ) -> T | None: # type: ignore[type-arg] + # Avoid repeated isinstance and list conversion in hot loop if isinstance(env_key, str): - env_key = [env_key] - - for k in env_key: - result = read(k.upper(), default_value) + # Most lookups will be string, avoid per-iteration check + result = read(env_key.upper(), default_value) if result is not default_value: return result - + else: + for k in env_key: + result = read(k.upper(), default_value) + if result is not default_value: + return result return default_value def envvar_prefix(self, prefix: KeyValue): @@ -83,12 +88,12 @@ def str( ) -> str | None: """Read a configuration value.""" key = read_key(key) - if self.section and key in self.section: - return self.section[key] + section = getattr(self, "section", None) + if section and key in section: + return section[key] - return self._read_env( - env_key or key, default_value, (lambda k, dv: self._env(k, dv)) - ) + # Use a named method instead of recreating lambda on each call (saves per-call lambda allocation) + return self._read_env(env_key or key, default_value, self._env) def int( self,