Я бы, на ночь глядя, написал бы так:
| Код | import bisect
class CacheManager(): def __init__(self, queryLifeTime = 30): self._queryLifeTime = queryLifeTime self._timestamps = [] self._queries = [] self._cache = {} def _deleteObsoleteResults(self): criticalTime = time.time() - self._queryLifeTime i = bisect.bisect_left(self._timestamps, criticalTime) self._timestamps = self._timestamps[i:] self._queries = self._queries[i:] def getResultFromCache(self, sql): ''' Пробует достать результат запроса из кеша, иначе возвращает None ''' self._deleteObsoleteResults() key = crc32(sql) value = self._cache.get(key) if value: value, i = value if i < len(self._queries) and key == self._queries[i]: return value
def putResultToCache(self, sql, result): ''' Добавляет результат запроса в кеш ''' self._deleteObsoleteResults() timestamp = time.time() sql = crc32(sql)
i = bisect.bisect_left(self._timestamps, timestamp) self._timestamps.insert(i, timestamp) self._queries.insert(i, sql)
self._cache[sql] = (result, i)
|
PS: pep-8! pep-8! pep-8! ;-) |