Есть ли библиотека кэширования Python?

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

cache.get(myfunction, duration=300)

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

Ответ 2

Из 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)

Ответ 3

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

Ответ 4

Joblib http://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.cache на функциях. Документация находится здесь: http://packages.python.org/joblib/memory.html

Ответ 5

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

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

Ответ 6

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

Ответ 7

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)

Ответ 8

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

Ответ 9

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

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]

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

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

Надеюсь, что это поможет

Ответ 10

Посмотрите на gocept.cache

Ответ 12

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

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

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

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