Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Посоветуйте как работать со структурой


Автор: Ch0bits 1.11.2009, 11:38
Вот есть такая структура, типа словаря с несколькими ключами.
[(k1, k2, v), (k1, k2, v), ...]
Список состоящий из кортежей, которые добавляются и удаляются. Первые его значения являются ключами поиска (k1, k2), а последнее значение - данные (v). Причем отбор по первому ключу происходит по условию, например k1>10, остальные ключи ищутся как у словаря.
Пока могу обрабатывать такую структуру тупо циклами.
Как бы это описать в функциональном стиле?

Автор: Ch0bits 1.11.2009, 12:20
Вот такой ###код пока.   smile 
Код

class CacheManager():
    def __init__(self, queryLifeTime = 30):
        self._queryLifeTime = queryLifeTime
        self._cache = []
        
    def _deleteObsoleteResults(self):
        criticalTime = time.time() - self._queryLifeTime
        for i in xrange(len(self._cache) - 1, -1, -1):
            if self._cache[i][0] < criticalTime:
                del self._cache[i]
        
    def getResultFromCache(self, sql):
        ''' Пробует достать результат запроса из кеша, иначе возвращает None '''
        self._deleteObsoleteResults()
        key = crc32(sql)
        for kort in self._cache:
            if kort[1] == key:
                return kort[2]
        
    def putResultToCache(self, sql, result):
        ''' Добавляет результат запроса в кеш '''
        self._deleteObsoleteResults()
        self._cache.append((time.time(), crc32(sql), result))

Автор: Daevaorn 2.11.2009, 00:49
Я бы, на ночь глядя, написал бы так:
Код

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! ;-)

Автор: alex_smirnov 2.11.2009, 05:22
Прошу прощения, но .putResultToCache тоже далеко не по pep8.

Код

self._cache[sql] = (result, i)))

Хы, чатиться -- вредная привычка, много скобок ;).

Спасибо за bisect, не знал :(, хорошая штука оказалась!

Автор: Ch0bits 2.11.2009, 14:38
Daevaorn, интересно, сразу не подумал про параллельные массивы. Пошел курить маны bisect...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)