Speed up rpsystem regex generation. Resolve #2265

This commit is contained in:
Griatch 2021-08-06 21:25:26 +02:00
parent bb8c212b8d
commit e91671c053
2 changed files with 27 additions and 5 deletions

View file

@ -103,6 +103,8 @@ from evennia import Command, CmdSet
from evennia import ansi from evennia import ansi
from evennia.utils.utils import lazy_property, make_iter, variable_from_module 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)) _AT_SEARCH_RESULT = variable_from_module(*settings.SEARCH_AT_RESULT.rsplit(".", 1))
# ------------------------------------------------------------ # ------------------------------------------------------------
# Emote parser # Emote parser
@ -256,12 +258,18 @@ def regex_tuple_from_key_alias(obj):
regex_tuple (tuple): A tuple regex_tuple (tuple): A tuple
(ordered_permutation_regex, obj, key/alias) (ordered_permutation_regex, obj, key/alias)
""" """
return ( global _REGEX_TUPLE_CACHE
re.compile(ordered_permutation_regex(" ".join([obj.key] + obj.aliases.all())), _RE_FLAGS), permutation_string = " ".join([obj.key] + obj.aliases.all())
obj,
obj.key, 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): def parse_language(speaker, emote):

View file

@ -4,7 +4,9 @@ Testing suite for contrib folder
""" """
import time
import datetime import datetime
from anything import Anything
from django.test import override_settings from django.test import override_settings
from evennia.commands.default.tests import CommandTest from evennia.commands.default.tests import CommandTest
from evennia.utils.test_resources import EvenniaTest, mockdelay, mockdeferLater 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("receiver of emotes"), self.receiver1)
self.assertEqual(self.speaker.search("colliding"), self.receiver2) 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): class TestRPSystemCommands(CommandTest):
def setUp(self): def setUp(self):