Есть ли библиотека кэширования Python? [закрытый]



Я ищу библиотеку кэширования Python, но пока ничего не могу найти. Мне нужен простой dict-подобный интерфейс, где я могу установить ключи и их действия и вернуть их в кэше. Что-то вроде:



cache.get(myfunction, duration=300)


который даст мне элемент из кэша, если он существует или вызовет функцию и сохранит его, если он не существует или истек. Кто-нибудь знает что-то подобное?

554   12  

12 ответов:

из Python 3.2 вы можете использовать декоратор @lru_cache из библиотеки functools. Это последний недавно используемый кэш, поэтому нет времени истечения срока действия для элементов в нем, но как быстрый хак это очень полезно.

from functools import lru_cache

@lru_cache(maxsize=256)
def f(x):
  return x*x

for x in range(20):
  print f(x)
for x in range(20):
  print f(x)

вы также можете взглянуть на Memoize декоратор. Вы, вероятно, могли бы заставить его делать то, что вы хотите, без особых изменений.

Joblibhttp://packages.python.org/joblib/ поддерживает функции кэширования в шаблоне Memoize. В основном, идея заключается в кэшировании вычислительно дорогих функций.

>>> from joblib import Memory
>>> mem = Memory(cachedir='/tmp/joblib')
>>> import numpy as np
>>> square = mem.cache(np.square)
>>> 
>>> a = np.vander(np.arange(3)).astype(np.float)
>>> b = square(a)                                   
________________________________________________________________________________
[Memory] Calling square...
square(array([[ 0.,  0.,  1.],
       [ 1.,  1.,  1.],
       [ 4.,  2.,  1.]]))
___________________________________________________________square - 0...s, 0.0min

>>> c = square(a)

вы также можете делать причудливые вещи, такие как использование @memory.кэш-декоратор по функциям. Документация находится здесь:http://packages.python.org/joblib/memory.html

никто еще не упоминал shelve. https://docs.python.org/2/library/shelve.html

Это не используется, но выглядит гораздо проще и может соответствовать вашим потребностям.

Я думаю python memcached API является распространенным инструментом, но я не использовал его сам и не уверен, поддерживает ли он необходимые функции.

import time

class CachedItem(object):
    def __init__(self, key, value, duration=60):
        self.key = key
        self.value = value
        self.duration = duration
        self.timeStamp = time.time()

    def __repr__(self):
        return '<CachedItem {%s:%s} expires at: %s>' % (self.key, self.value, time.time() + self.duration)

class CachedDict(dict):

    def get(self, key, fn, duration):
        if key not in self \
            or self[key].timeStamp + self[key].duration < time.time():
                print 'adding new value'
                o = fn(key)
                self[key] = CachedItem(key, o, duration)
        else:
            print 'loading from cache'

        return self[key].value



if __name__ == '__main__':

    fn = lambda key: 'value of %s  is None' % key

    ci = CachedItem('a', 12)
    print ci 
    cd = CachedDict()
    print cd.get('a', fn, 5)
    time.sleep(2)
    print cd.get('a', fn, 6)
    print cd.get('b', fn, 6)
    time.sleep(2)
    print cd.get('a', fn, 7)
    print cd.get('b', fn, 7)

попробуйте redis, это одно из самых чистых и простых решений для приложений для обмена данными атомарным способом или если у вас есть какая-то платформа веб-сервера. Его очень легко настроить, вам понадобится клиент python redishttp://pypi.python.org/pypi/redis

вы можете использовать мое простое решение проблемы. Это действительно просто, ничего особенного:

class MemCache(dict):
    def __init__(self, fn):
        dict.__init__(self)
        self.__fn = fn

    def __getitem__(self, item):
        if item not in self:
            dict.__setitem__(self, item, self.__fn(item))
        return dict.__getitem__(self, item)

mc = MemCache(lambda x: x*x)

for x in xrange(10):
    print mc[x]

for x in xrange(10):
    print mc[x]

ему действительно не хватает функциональности истечения срока действия, но вы можете легко расширить его, указав конкретное правило в MemCache c-tor.

код надежды достаточно понятен, но если нет, просто упомянем, что кэш передается функции перевода в качестве одного из его параметров c-tor. Он используется в свою очередь для генерации кэшированного вывода относительно вход.

надеюсь, что это помогает

посмотрите на gocept.кэш

посмотрите на bda.кэш http://pypi.python.org/pypi/bda.cache - использует ZCA и тестируется с zope и bfg.

keyring-Лучшая библиотека кэширования python. Вы можете использовать

keyring.set_password("service","jsonkey",json_res)

json_res= keyring.get_password("service","jsonkey")

json_res= keyring.core.delete_password("service","jsonkey")

Comments

    Ничего не найдено.