diff --git a/conservancy_beancount/filters.py b/conservancy_beancount/filters.py index 107f9f470e803197806733e145ec76e02c7a2b73..a7a2b2311bcf3bdd79c4152ba816ccb6773296e9 100644 --- a/conservancy_beancount/filters.py +++ b/conservancy_beancount/filters.py @@ -87,5 +87,12 @@ def remove_opening_balance_txn(entries: Entries) -> Optional[Transaction]: break else: return None - del entries[index] + # Deleting from the beginning of a list is O(n) slow in Python: + # + # So don't do that, and instead replace the transaction with a placeholder + # directive. + # The type:ignore is because of the funny way Beancount builds directives. + entries[index] = bc_data.Custom( # type:ignore[operator] + entry.meta, entry.date, "Removed opening balances", [], + ) return entry diff --git a/tests/test_filters.py b/tests/test_filters.py index 9ba4bc4ddf538b5080972676d7a3996a7f8e8f40..ca83d74749d32f0321a923bce15cbf13e228c16c 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -153,5 +153,9 @@ def test_remove_opening_balance_txn(opening_txn): entries.insert(1, opening_txn) actual = filters.remove_opening_balance_txn(entries) assert actual is opening_txn - assert len(entries) == 2 assert opening_txn not in entries + assert not any( + post.account.startswith('Equity:') + for entry in entries + for post in getattr(entry, 'postings', ()) + )