Skip to content

Commit

Permalink
Core: Cleanup: Replace direct calling of dunder methods on objects
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Mysteryem committed Jan 30, 2025
1 parent 1fe8024 commit 25d1ed4
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 13 deletions.
12 changes: 6 additions & 6 deletions BaseClasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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:
Expand All @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion CommonClient.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 6 additions & 6 deletions Options.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 25d1ed4

Please sign in to comment.