diff options
author | Raymond Hettinger <python@rcn.com> | 2010-08-14 21:17:48 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2010-08-14 21:17:48 (GMT) |
commit | d9e8cc6249c7ff4ceeff3217a7671bee623d88a7 (patch) | |
tree | c28ba907e7e6b54567526ddfd8e989664640f550 /Lib/re.py | |
parent | 62829dc727fc708e54aa6f34e53759f7acfa8594 (diff) | |
download | cpython-d9e8cc6249c7ff4ceeff3217a7671bee623d88a7.zip cpython-d9e8cc6249c7ff4ceeff3217a7671bee623d88a7.tar.gz cpython-d9e8cc6249c7ff4ceeff3217a7671bee623d88a7.tar.bz2 |
Clean-up the cache patch for the re module.
Diffstat (limited to 'Lib/re.py')
-rw-r--r-- | Lib/re.py | 55 |
1 files changed, 7 insertions, 48 deletions
@@ -250,53 +250,14 @@ def escape(pattern): # -------------------------------------------------------------------- # internals -_cache = {} -_cache_repl = {} - _pattern_type = type(sre_compile.compile("", 0)) -_MAXCACHE = 500 - -def _shrink_cache(cache_dict, max_length, divisor=5): - """Make room in the given cache. - - Args: - cache_dict: The cache dictionary to modify. - max_length: Maximum # of entries in cache_dict before it is shrunk. - divisor: Cache will shrink to max_length - 1/divisor*max_length items. - """ - # Toss out a fraction of the entries at random to make room for new ones. - # A random algorithm was chosen as opposed to simply cache_dict.popitem() - # as popitem could penalize the same regular expression repeatedly based - # on its internal hash value. Being random should spread the cache miss - # love around. - cache_keys = tuple(cache_dict.keys()) - overage = len(cache_keys) - max_length - if overage < 0: - # Cache is already within limits. Normally this should not happen - # but it could due to multithreading. - return - number_to_toss = max_length // divisor + overage - # The import is done here to avoid a circular depencency. - import random - if not hasattr(random, 'sample'): - # Do nothing while resolving the circular dependency: - # re->random->warnings->tokenize->string->re - return - for doomed_key in random.sample(cache_keys, number_to_toss): - try: - del cache_dict[doomed_key] - except KeyError: - # Ignore problems if the cache changed from another thread. - pass - -def _compile(*args): - return _compile_typed(type(args[0]), *args) - -@functools.lru_cache(maxsize=_MAXCACHE) -def _compile_typed(type, *key): +def _compile(pattern, flags): + return _compile_typed(type(pattern), pattern, flags) + +@functools.lru_cache(maxsize=500) +def _compile_typed(text_bytes_type, pattern, flags): # internal: compile pattern - pattern, flags = key if isinstance(pattern, _pattern_type): if flags: raise ValueError( @@ -305,12 +266,10 @@ def _compile_typed(type, *key): if not sre_compile.isstring(pattern): raise TypeError("first argument must be string or compiled pattern") return sre_compile.compile(pattern, flags) - return p -@functools.lru_cache(maxsize=_MAXCACHE) -def _compile_repl(*key): +@functools.lru_cache(maxsize=500) +def _compile_repl(repl, pattern): # internal: compile replacement pattern - repl, pattern = key return sre_parse.parse_template(repl, pattern) def _expand(pattern, match, template): |