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.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):

View file

@ -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):