Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## 2024-05-19 - Optimize `balanceTranslator` membership testing
**Learning:** Checking membership inside a loop with a freshly-constructed list comprehension gives an O(N * M) performance impact. Pre-computing a set of keys can reduce it to O(N + M).
**Action:** When finding a list membership test `x not in [y for y in Y]` inside a loop, elevate the inner list creation out of the loop and convert it to a `set` to reduce time complexity to O(1).
12 changes: 4 additions & 8 deletions bionetgen/atomizer/writer/bnglWriter.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,17 +116,13 @@ def balanceTranslator(reactant, product, translator):
for rMolecule in rMolecules:
for pMolecule in pMolecules:
if rMolecule.name == pMolecule.name:
p_names = {y.name for y in pMolecule.components}
r_names = {y.name for y in rMolecule.components}
overFlowingComponents = [
x
for x in rMolecule.components
if x.name not in [y.name for y in pMolecule.components]
x for x in rMolecule.components if x.name not in p_names
]
overFlowingComponents.extend(
[
x
for x in pMolecule.components
if x.name not in [y.name for y in rMolecule.components]
]
[x for x in pMolecule.components if x.name not in r_names]
)
rMolecule.removeComponents(overFlowingComponents)
pMolecule.removeComponents(overFlowingComponents)
Expand Down
Loading