Модераторы: pythonwin, Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посоветуйте как работать со структурой 
V
    Опции темы
Ch0bits
Дата 1.11.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



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


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Вот такой ###код пока.   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))

PM WWW   Вверх
Daevaorn
Дата 2.11.2009, 00:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



Я бы, на ночь глядя, написал бы так:
Код

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

Это сообщение отредактировал(а) Daevaorn - 4.11.2009, 13:49
PM MAIL WWW   Вверх
alex_smirnov
Дата 2.11.2009, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Прошу прощения, но .putResultToCache тоже далеко не по pep8.

Код

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

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

Спасибо за bisect, не знал :(, хорошая штука оказалась!
PM GTalk Jabber   Вверх
Ch0bits
Дата 2.11.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Daevaorn, интересно, сразу не подумал про параллельные массивы. Пошел курить маны bisect...
PM WWW   Вверх
Google
  Дата 10.12.2019, 00:43 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1287 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.