diff --git a/graphrag/config/environment_reader.py b/graphrag/config/environment_reader.py index 258422666c..6a92a01ec1 100644 --- a/graphrag/config/environment_reader.py +++ b/graphrag/config/environment_reader.py @@ -18,9 +18,11 @@ def read_key(value: KeyValue) -> str: """Read a key value.""" - if not isinstance(value, str): - return value.value.lower() - return value.lower() + # It is slightly faster to use isinstance(str) than to fail on hasattr(value, 'value') + # Check most likely and fastest case first + if isinstance(value, str): + return value.lower() + return value.value.lower() class EnvironmentReader: @@ -82,13 +84,12 @@ def str( default_value: str | None = None, ) -> str | None: """Read a configuration value.""" - key = read_key(key) - if self.section and key in self.section: - return self.section[key] - - return self._read_env( - env_key or key, default_value, (lambda k, dv: self._env(k, dv)) - ) + key_str = read_key(key) + section = getattr(self, "section", None) + if section and key_str in section: + return section[key_str] + # Avoids lambda creation on every call; use a direct method call + return self._read_env(env_key or key_str, default_value, self._env) def int( self, @@ -140,16 +141,25 @@ def list( default_value: list | None = None, ) -> list | None: """Parse an list configuration value.""" - key = read_key(key) - result = None - if self.section and key in self.section: - result = self.section[key] + key_str = read_key(key) + section = getattr(self, "section", None) + if section and key_str in section: + result = section[key_str] if isinstance(result, list): return result - if result is None: - result = self.str(key, env_key) + result = self.str(key, env_key) if result is not None: - result = [s.strip() for s in result.split(",")] - return [s for s in result if s] + # Avoid allocating a list in a list comprehension just for stripping; + # split and filter in a single pass for better runtime+memory efficiency + # `.split(',')` returns str elements which need to be stripped and filtered; + # accumulate only stripped non-empty once. + splits = result.split(",") + # Using a generator expression and list comprehension with conditional, skipping empty + out = [] + for s in splits: + stripped = s.strip() + if stripped: + out.append(stripped) + return out return default_value