diff --git a/evennia/contrib/rpsystem.py b/evennia/contrib/rpsystem.py index 4cb54fb68f..f50e5d1c37 100644 --- a/evennia/contrib/rpsystem.py +++ b/evennia/contrib/rpsystem.py @@ -103,6 +103,8 @@ from evennia import Command, CmdSet from evennia import ansi from evennia.utils.utils import lazy_property, make_iter, variable_from_module +_REGEX_TUPLE_CACHE = {} + _AT_SEARCH_RESULT = variable_from_module(*settings.SEARCH_AT_RESULT.rsplit(".", 1)) # ------------------------------------------------------------ # Emote parser @@ -256,12 +258,18 @@ def regex_tuple_from_key_alias(obj): regex_tuple (tuple): A tuple (ordered_permutation_regex, obj, key/alias) + """ - return ( - re.compile(ordered_permutation_regex(" ".join([obj.key] + obj.aliases.all())), _RE_FLAGS), - obj, - obj.key, - ) + global _REGEX_TUPLE_CACHE + permutation_string = " ".join([obj.key] + obj.aliases.all()) + + if permutation_string not in _REGEX_TUPLE_CACHE: + _REGEX_TUPLE_CACHE[permutation_string] = ( + re.compile(ordered_permutation_regex(permutation_string), _RE_FLAGS), + obj, + obj.key, + ) + return _REGEX_TUPLE_CACHE[permutation_string] def parse_language(speaker, emote): diff --git a/evennia/contrib/tests.py b/evennia/contrib/tests.py index e2c9fd9d0b..1671563d79 100644 --- a/evennia/contrib/tests.py +++ b/evennia/contrib/tests.py @@ -4,7 +4,9 @@ Testing suite for contrib folder """ +import time import datetime +from anything import Anything from django.test import override_settings from evennia.commands.default.tests import CommandTest from evennia.utils.test_resources import EvenniaTest, mockdelay, mockdeferLater @@ -233,6 +235,18 @@ class TestRPSystem(EvenniaTest): self.assertEqual(self.speaker.search("receiver of emotes"), self.receiver1) self.assertEqual(self.speaker.search("colliding"), self.receiver2) + def test_regex_tuple_from_key_alias(self): + self.speaker.aliases.add("foo bar") + self.speaker.aliases.add("this thing is a long thing") + t0 = time.time() + result = rpsystem.regex_tuple_from_key_alias(self.speaker) + t1 = time.time() + result = rpsystem.regex_tuple_from_key_alias(self.speaker) + t2 = time.time() + # print(f"t1: {t1 - t0}, t2: {t2 - t1}") + self.assertLess(t2-t1, t1-t0) + self.assertEqual(result, (Anything, self.speaker, self.speaker.key)) + class TestRPSystemCommands(CommandTest): def setUp(self):