From 98477e27aae99f6c4663a0fb11cb76d9581a51fc Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Tue, 8 Apr 2025 22:57:31 +0100 Subject: [PATCH] Core: Speed up fill_restrictive item_pool pop loop (#4536) * Core: Speed up fill_restrictive item_pool pop loop Items from `reachable_items` are placed in last-in-first-out order, so items being placed will be towards the end of `item_pool`, but the iteration to find the item was iterating from the start of `item_pool`. Now also uses `del` instead of `.pop()` for an additional, tiny, performance increase. It is unlikely for there to be a noticeable difference in most cases. Only generating with many worlds with a high percentage of progression items and fast access rules is likely to see a difference with this change. --skip_output generation of 400 template A Hat in Time yamls with progression balancing disabled goes from 76s to 43s (43% reduction) for me with this patch. This placed 43200 progression items out of 89974 items total (48% progression items). * Fix comment typo "be" was missing. --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- Fill.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Fill.py b/Fill.py index fe39b74f..cce7aec2 100644 --- a/Fill.py +++ b/Fill.py @@ -75,9 +75,11 @@ def fill_restrictive(multiworld: MultiWorld, base_state: CollectionState, locati items_to_place.append(reachable_items[next_player].pop()) for item in items_to_place: - for p, pool_item in enumerate(item_pool): + # The items added into `reachable_items` are placed starting from the end of each deque in + # `reachable_items`, so the items being placed are more likely to be found towards the end of `item_pool`. + for p, pool_item in enumerate(reversed(item_pool), start=1): if pool_item is item: - item_pool.pop(p) + del item_pool[-p] break maximum_exploration_state = sweep_from_pool(