From cc29f33a33b05e0151b26ab18c465125c5eadf1e Mon Sep 17 00:00:00 2001 From: odrling Date: Thu, 15 Dec 2022 11:46:05 +0100 Subject: [PATCH 1/2] use deque instead of lists for character stacks only pop and append are used, so deque is more efficient. (the _utils import is not used in the file) --- shakespearelang/_character.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/shakespearelang/_character.py b/shakespearelang/_character.py index afedccf..19a8eb3 100644 --- a/shakespearelang/_character.py +++ b/shakespearelang/_character.py @@ -1,5 +1,6 @@ +from collections import deque + from .errors import ShakespeareRuntimeError -from ._utils import normalize_name class Character: @@ -7,7 +8,7 @@ class Character: def __init__(self): self.value = 0 - self.stack = [] + self.stack = deque() def __str__(self): return f'{self.value} ({" ".join([str(v) for v in self.stack][::-1])})' From d09d7b08d6d56f1523ffb7a20342c8b196e0ccc5 Mon Sep 17 00:00:00 2001 From: odrling Date: Sat, 13 Jan 2024 21:54:22 +0100 Subject: [PATCH 2/2] fix stack tests with deque --- shakespearelang/tests/test_stacks.py | 72 ++++++++++++++-------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/shakespearelang/tests/test_stacks.py b/shakespearelang/tests/test_stacks.py index 35d0b26..3ebd8b1 100644 --- a/shakespearelang/tests/test_stacks.py +++ b/shakespearelang/tests/test_stacks.py @@ -1,3 +1,5 @@ +from collections import deque + from shakespearelang import Shakespeare from shakespearelang.errors import ShakespeareRuntimeError import pytest @@ -16,19 +18,19 @@ def test_push(): s.run_event("[Enter Romeo and Juliet]") c = s.state.character_by_name("Juliet") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 s.run_sentence("Remember a furry animal.", "Romeo") - assert c.stack == [2] + assert c.stack == deque([2]) assert c.value == 0 s.run_sentence("Remember a furry furry animal.", "Romeo") - assert c.stack == [2, 4] + assert c.stack == deque([2, 4]) assert c.value == 0 s.run_sentence("Remember a furry furry furry animal.", "Romeo") - assert c.stack == [2, 4, 8] + assert c.stack == deque([2, 4, 8]) assert c.value == 0 @@ -37,21 +39,21 @@ def test_pop(): s.run_event("[Enter Romeo and Juliet]") c = s.state.character_by_name("Juliet") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 - c.stack = [234, 123, 678] + c.stack = deque([234, 123, 678]) s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123] + assert c.stack == deque([234, 123]) assert c.value == 678 s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234] + assert c.stack == deque([234]) assert c.value == 123 s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 234 @@ -60,53 +62,53 @@ def test_sequence(): s.run_event("[Enter Romeo and Juliet]") c = s.state.character_by_name("Juliet") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 - c.stack = [234, 123, 678] + c.stack = deque([234, 123, 678]) s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123] + assert c.stack == deque([234, 123]) assert c.value == 678 s.run_sentence("Remember a furry animal.", "Romeo") - assert c.stack == [234, 123, 2] + assert c.stack == deque([234, 123, 2]) assert c.value == 678 s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123] + assert c.stack == deque([234, 123]) assert c.value == 2 s.run_sentence("Remember a furry furry animal.", "Romeo") - assert c.stack == [234, 123, 4] + assert c.stack == deque([234, 123, 4]) assert c.value == 2 s.run_sentence("Remember a furry furry furry animal.", "Romeo") - assert c.stack == [234, 123, 4, 8] + assert c.stack == deque([234, 123, 4, 8]) assert c.value == 2 s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123, 4] + assert c.stack == deque([234, 123, 4]) assert c.value == 8 s.run_sentence("Remember a furry furry furry furry animal.", "Romeo") - assert c.stack == [234, 123, 4, 16] + assert c.stack == deque([234, 123, 4, 16]) assert c.value == 8 s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123, 4] + assert c.stack == deque([234, 123, 4]) assert c.value == 16 s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123] + assert c.stack == deque([234, 123]) assert c.value == 4 s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234] + assert c.stack == deque([234]) assert c.value == 123 s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 234 @@ -115,7 +117,7 @@ def test_errors_on_pop_from_empty(): s.run_event("[Enter Romeo and Juliet]") c = s.state.character_by_name("Juliet") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 with pytest.raises(ShakespeareRuntimeError) as exc: @@ -124,7 +126,7 @@ def test_errors_on_pop_from_empty(): assert ">>Recall thy terrible memory of thy imminent death.<<" in str(exc.value) assert exc.value.interpreter == s - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 @@ -133,27 +135,27 @@ def test_conditional_push(): s.run_event("[Enter Romeo and Juliet]") c = s.state.character_by_name("Juliet") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 s.state.global_boolean = False s.run_sentence("If so, remember a furry animal.", "Romeo") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 s.state.global_boolean = True s.run_sentence("If not, remember a furry animal.", "Romeo") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 s.state.global_boolean = True s.run_sentence("If so, remember a furry animal.", "Romeo") - assert c.stack == [2] + assert c.stack == deque([2]) assert c.value == 0 s.state.global_boolean = False s.run_sentence("If not, remember a furry furry animal.", "Romeo") - assert c.stack == [2, 4] + assert c.stack == deque([2, 4]) assert c.value == 0 @@ -162,27 +164,27 @@ def test_conditional_pop(): s.run_event("[Enter Romeo and Juliet]") c = s.state.character_by_name("Juliet") - assert c.stack == [] + assert c.stack == deque([]) assert c.value == 0 - c.stack = [234, 123, 678] + c.stack = deque([234, 123, 678]) s.state.global_boolean = False s.run_sentence("If so, recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123, 678] + assert c.stack == deque([234, 123, 678]) assert c.value == 0 s.state.global_boolean = True s.run_sentence("If not, recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123, 678] + assert c.stack == deque([234, 123, 678]) assert c.value == 0 s.state.global_boolean = True s.run_sentence("If so, recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234, 123] + assert c.stack == deque([234, 123]) assert c.value == 678 s.state.global_boolean = False s.run_sentence("If not, recall thy terrible memory of thy imminent death.", "Romeo") - assert c.stack == [234] + assert c.stack == deque([234]) assert c.value == 123