From 25d1ed4cea0b65fffbf92754437d90f694f360b3 Mon Sep 17 00:00:00 2001 From: Thomas Barlow Date: Thu, 30 Jan 2025 17:08:00 +0000 Subject: [PATCH] Core: Cleanup: Replace direct calling of dunder methods on objects Calling the dunder method has to: 1. Look up the dunder method for that object/class 2. Bind a new method instance to the object instance 3. Call the method with its arguments 4. Run the appropriate operation on the object Whereas running the appropriate operation on the object from the start skips straight to step 4. Region.Register.__getitem__ is called a lot without #4583. In that case, generation of 10 template Blasphemous yamls with `--skip_output --seed 1` and progression balancing disabled went from 19.0s to 18.8s (1.3% reduction in generation duration). From profiling with `timeit` ```py def __getitem__(self, index: int) -> Location: return self._list[index] ``` appears to be about twice as fast as the old code: ```py def __getitem__(self, index: int) -> Location: return self._list.__getitem__(index) ``` Besides this, there is not expected to be any noticeable difference in performance, and there is not expected to be any difference in semantics with these changes. --- BaseClasses.py | 12 ++++++------ CommonClient.py | 2 +- Options.py | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index e19ba5f7772e..d3490d7240d6 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1070,13 +1070,13 @@ def __init__(self, region_manager: MultiWorld.RegionManager): self.region_manager = region_manager def __getitem__(self, index: int) -> Location: - return self._list.__getitem__(index) + return self._list[index] def __setitem__(self, index: int, value: Location) -> None: raise NotImplementedError() def __len__(self) -> int: - return self._list.__len__() + return len(self._list) # This seems to not be needed, but that's a bit suspicious. # def __del__(self): @@ -1087,8 +1087,8 @@ def copy(self): class LocationRegister(Register): def __delitem__(self, index: int) -> None: - location: Location = self._list.__getitem__(index) - self._list.__delitem__(index) + location: Location = self._list[index] + del self._list[index] del(self.region_manager.location_cache[location.player][location.name]) def insert(self, index: int, value: Location) -> None: @@ -1099,8 +1099,8 @@ def insert(self, index: int, value: Location) -> None: class EntranceRegister(Register): def __delitem__(self, index: int) -> None: - entrance: Entrance = self._list.__getitem__(index) - self._list.__delitem__(index) + entrance: Entrance = self._list[index] + del self._list[index] del(self.region_manager.entrance_cache[entrance.player][entrance.name]) def insert(self, index: int, value: Entrance) -> None: diff --git a/CommonClient.py b/CommonClient.py index 996ba3300575..84ccec86eb7c 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -224,7 +224,7 @@ def __iter__(self) -> typing.Iterator[str]: return iter(self._game_store) def __repr__(self) -> str: - return self._game_store.__repr__() + return repr(self._game_store) def lookup_in_game(self, code: int, game_name: typing.Optional[str] = None) -> str: """Returns the name for an item/location id in the context of a specific game or own game if `game` is diff --git a/Options.py b/Options.py index d9122d444c97..3764e013acb0 100644 --- a/Options.py +++ b/Options.py @@ -858,13 +858,13 @@ def get_option_name(self, value): return ", ".join(f"{key}: {v}" for key, v in value.items()) def __getitem__(self, item: str) -> typing.Any: - return self.value.__getitem__(item) + return self.value[item] def __iter__(self) -> typing.Iterator[str]: - return self.value.__iter__() + return iter(self.value) def __len__(self) -> int: - return self.value.__len__() + return len(self.value) class ItemDict(OptionDict): @@ -1026,10 +1026,10 @@ def __iter__(self) -> typing.Iterator[PlandoText]: yield from self.value def __getitem__(self, index: typing.SupportsIndex) -> PlandoText: - return self.value.__getitem__(index) + return self.value[index] def __len__(self) -> int: - return self.value.__len__() + return len(self.value) class ConnectionsMeta(AssembleOptions): @@ -1176,7 +1176,7 @@ def get_option_name(cls, value: typing.List[PlandoConnection]) -> str: connection.exit) for connection in value]) def __getitem__(self, index: typing.SupportsIndex) -> PlandoConnection: - return self.value.__getitem__(index) + return self.value[index] def __iter__(self) -> typing.Iterator[PlandoConnection]: yield from self.value