diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..e40c97b --- /dev/null +++ b/.jules/bolt.md @@ -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). diff --git a/bionetgen/atomizer/writer/bnglWriter.py b/bionetgen/atomizer/writer/bnglWriter.py index d6a446e..8bc50b0 100644 --- a/bionetgen/atomizer/writer/bnglWriter.py +++ b/bionetgen/atomizer/writer/bnglWriter.py @@ -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)