পাইথন ক্যাচিং লাইব্রেরি আছে?


123

আমি পাইথন ক্যাচিং লাইব্রেরির সন্ধান করছি তবে এখন পর্যন্ত কিছুই খুঁজে পাচ্ছি না। আমার একটি সাধারণ- dictমত ইন্টারফেস দরকার যেখানে আমি কীগুলি এবং তাদের সমাপ্তির সেট করতে এবং সেগুলিকে ফিরে ক্যাশে আনতে পারি। এর মতো কিছু বাছাই করুন:

cache.get(myfunction, duration=300)

যা আমাকে ক্যাশে থেকে আইটেমটি উপস্থিত থাকলে তা উপস্থিত করবে বা ফাংশনটি কল করবে এবং এটির মেয়াদ শেষ না হলে বা সংরক্ষণ করবে। কেউ কি এরকম কিছু জানে?


আমি মনে করি আপনি itemআপনার উদাহরণ থেকে অনুপস্থিত ।
সাইলেন্টগোস্ট

হ্যাঁ, এটির জন্য সম্ভবত একটি কী প্রয়োজন হবে ... এবং, ২.x।
স্ট্যাভ্রোস করোকিঠাকিস

3
একই প্রক্রিয়া মধ্যে বা প্রক্রিয়া মধ্যে ভাগ? থ্রেডেড নাকি?
অ্যারন ওয়াটার্স

1
এটি থ্রেড-নিরাপদ হওয়া উচিত, দুঃখিত, আমার উল্লেখ করা উচিত ছিল। প্রক্রিয়াগুলির মধ্যে ভাগ করার দরকার নেই।
স্ট্যাভ্রোস করোকিঠাকিস

6
ডিস্ক ক্যাশে চেষ্টা করুন : অ্যাপাচি 2 লাইসেন্সযুক্ত, 100% কভারেজ, থ্রেড-সেফ, প্রক্রিয়া-নিরাপদ, একাধিক উচ্ছেদ নীতি এবং দ্রুত (মানদণ্ড)
গ্রান্টজে

উত্তর:


52

আহ, আমি এটি অনুসন্ধান করে চলেছি এবং যা আমি পেয়েছি তার মধ্যে একটি উইকি ছিল যা এটি ডাব্লুএসজিআই মিডলওয়্যার হিসাবে কীভাবে ব্যবহার করবেন তা উল্লেখ করেছিল। আমার যা দরকার তা দেখে মনে হচ্ছে, ধন্যবাদ।
স্ট্যাভ্রোস করোকিঠাকিস

7
ডগস্পাইলও দেখুন - ধারণা করা যায় নতুন এবং উন্নত বিকার।
s29

72

পাইথন ৩.২ থেকে আপনি ফান্টুলস লাইব্রেরি থেকে ডেকরেটার @lru_cache ব্যবহার করতে পারেন । এটি সর্বশেষে ব্যবহৃত ক্যাশে, সুতরাং এতে থাকা আইটেমগুলির জন্য মেয়াদোত্তীর্ণ হওয়ার সময় নেই তবে দ্রুত হ্যাক হিসাবে এটি খুব দরকারী useful

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)

20
cachetools অফার এই একটি চমৎকার বাস্তবায়ন এবং এটি সামঞ্জস্যপূর্ণ পাইথন 2 এবং 3. পাইথন এর
vaab

1
cachetools জন্য বড় +1 টি ... বেশ শান্ত মনে হচ্ছে এবং একটি দম্পতি আরো ক্যাশে আলগোরিদিম :) হয়েছে
উয়র্ন Hees

এটি কখনও পরামর্শ দেওয়া উচিত নয়! সুসংগত থাকুন।
পাসক্যালভিকুটেন

1
থ্রো সুরক্ষিত না থাকার বিষয়ে আপনার মন্তব্য থেকে @ রবস্লোনে, দুই বছর (বিয়োগ 4 দিন ..) থেকে, এটি পরিবর্তিত হতে পারে। আমার ক্যাশেটোল ২.০ আছে এবং আমি কোডটিতে দেখতে পাচ্ছি যে এটি একটি আরলক ব্যবহার করে। /usr/lib/python2.7/site-packages/cachetools/func.py
মোটি

@ মোটি: ক্যাচটিউলস এর জন্য ডকুমেন্টেশন .0.০.০.০ এ বলেছে: "দয়া করে সচেতন হন যে এই সমস্ত শ্রেণি থ্রেড-নিরাপদ নয় multiple একাধিক থ্রেড থেকে ভাগ করা ক্যাশে অ্যাক্সেসটি অবশ্যই সঠিকভাবে সিঙ্ক্রোনাইজ করা উচিত, উদাহরণস্বরূপ মেমোজাইজিং ডেকোরেটরগুলির সাথে একটি সহ একটি ব্যবহার করে উপযুক্ত লক অবজেক্ট "(
গা

28

আপনি মেমোয়েজ ডেকরেটরটিও একবার দেখে নিতে পারেন । আপনি সম্ভবত এটি খুব বেশি পরিবর্তন ছাড়াই যা করতে চান তা করতে পেরেছেন।


যে চালাক। কয়েকটি পরিবর্তন এবং সাজসজ্জার এমনকি একটি নির্দিষ্ট সময়ের পরেও মেয়াদ শেষ হতে পারে।
এহতেশ চৌধুরী

আপনি অবশ্যই ডেকরেটারে ক্যাশে একটি স্থান-ভিত্তিক সীমা লিখতে পারেন। এটি সহায়ক হবে যদি আপনি কোনও ফাংশন চান, উদাহরণস্বরূপ, টার্ম অনুসারে ফাইবোনাচি সিকোয়েন্স টার্ম তৈরি করতে। আপনি ক্যাচিং চান, তবে আপনার কেবল শেষ দুটি মান দরকার - এগুলি সংরক্ষণ করা কেবল স্থান অদক্ষ।
রিম

14

জবলিব https://joblib.readthedocs.io মেমোজ প্যাটার্নে ক্যাশে ফাংশন সমর্থন করে। বেশিরভাগ ক্ষেত্রে, ধারণাটি হ'ল গণনা ব্যয়বহুল ফাংশনগুলি ক্যাশে করা।

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

আপনি ফাংশনগুলিতে @ মেমরি.ক্যাচ ডেকোরেটর ব্যবহার করার মতো অভিনব জিনিসগুলিও করতে পারেন। ডকুমেন্টেশনটি এখানে: https://joblib.readthedocs.io/en/latest/generated/joblib.Memory.html


2
সাইডেনোট হিসাবে, আপনি বড় নুমপি অ্যারে নিয়ে কাজ করার সময় জবলিবটি সত্যিই জ্বলজ্বল করে, যেহেতু তাদের সাথে বিশেষভাবে ডিল করার জন্য বিশেষ পদ্ধতি রয়েছে।
অ্যালেক্সবডু

12

এখনও তাকটির কথা কেউ উল্লেখ করেনি। https://docs.python.org/2/library/shelve.html

এটি মুখোশযুক্ত নয়, তবে এটি আরও সহজ দেখাচ্ছে এবং আপনার প্রয়োজনের সাথে খাপ খায়।


আমি স্ট্যান্ডার্ড- এবং মাল্টিপ্রসেস-নিরাপদ র‌্যাপারটি স্ট্যান্ডার্ড সেল্ভ মডিউলটির জন্য লিখেছি (HTTP অনুরোধগুলি ক্যাশে করার জন্য একটি সহায়ক ফাংশন সহ) যে কারওর জন্য দরকারী: github.com/cristoper/shelfcache
ক্রিস্টোপার

9

আমি মনে করি পাইথন মেমক্যাচড এপিআই হ'ল প্রচলিত সরঞ্জাম, তবে আমি নিজে এটি ব্যবহার করিনি এবং এটি আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলি সমর্থন করে কিনা তা নিশ্চিত নই।


3
এটি একটি শিল্পের মান, তবে আমি কেবল চাই একটি সাধারণ ইন মেমরি স্টোরেজ মেকানিজম যা 100 টি কী বা তাই ধরে রাখতে পারে এবং মেমক্যাচ করা কিছুটা ওভারকিল। যদিও উত্তরের জন্য আপনাকে ধন্যবাদ।
স্টাভ্রোস করোকিঠাকিস

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)

5
আমি এরকম কিছু করেছি, তবে এটি অসীমভাবে বৃদ্ধি পেতে এড়াতে আপনার মাল্টিথ্রেডিংয়ের জন্য লক এবং একটি আকারের প্যারামিটার প্রয়োজন। তারপরে আপনার অ্যাক্সেসের মাধ্যমে কীগুলি বাছাই করার জন্য কিছু ফাংশন প্রয়োজন
সর্বাধিক

Repr লাইন ভুল (self.timeStamp ব্যবহার করা উচিত)। পাশাপাশি এটি একটি দরিদ্র বাস্তবায়ন যা অগত্যা প্রতিটি প্রাপ্তির জন্য গণিত করে ()। মেয়াদোত্তীর্ণের সময়টি ক্যাশেডেম আইটিমে গণনা করা উচিত।
আইভো

1
প্রকৃতপক্ষে, আপনি যদি কেবল getপদ্ধতিটি প্রয়োগ করেন তবে এটি কোনও ডিক সাবক্লাস হওয়া উচিত নয়, এটি এমবেডড ডিকের সাহায্যে একটি বস্তু হওয়া উচিত।
আইভো

6

আপনি সমস্যার আমার সহজ সমাধানটি ব্যবহার করতে পারেন। এটি সত্যই সোজা, অভিনব কিছু নয়:

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]

প্রকৃতপক্ষে এতে মেয়াদোত্তীর্ণ চমকপ্রদতা নেই, তবে আপনি মেমচেচে সি-টরটিতে একটি নির্দিষ্ট নিয়ম নির্দিষ্ট করে এটি সহজেই প্রসারিত করতে পারেন।

হোপ কোড যথেষ্ট স্ব-ব্যাখ্যামূলক, তবে যদি তা না হয় তবে কেবল উল্লেখ করতেই হবে যে ক্যাশেটিকে তার সি-টর প্যারামগুলির মধ্যে একটি হিসাবে অনুবাদ ফাংশনটি পাস করা হচ্ছে। এটি ইনপুট সম্পর্কিত ক্যাশেড আউটপুট উত্পন্ন করতে পরিবর্তে ব্যবহৃত হয়।

আশা করি এটা সাহায্য করবে


1
সাধারণ কিছু প্রস্তাব দেওয়ার জন্য +1। সমস্যার উপর নির্ভর করে, এটি কেবল কাজের জন্য হাতিয়ার হতে পারে। দ্রষ্টব্য: আপনি প্রয়োজন হবে না else__getitem__:)
hiwaylon

কেন সে প্রয়োজন হবে না elseযে __getitem__? সেখান থেকেই তিনি
ডিকটি পপুল করেন

5

পুনরায় চেষ্টা করুন, অ্যাপ্লিকেশনগুলির জন্য পারমাণবিক উপায়ে ডেটা ভাগ করা বা আপনার যদি কোনও ওয়েব সার্ভার প্ল্যাটফর্ম পাওয়া যায় তবে এটি অন্যতম পরিষ্কার এবং সহজ সমাধান। এটি সেটআপ করা খুব সহজ, আপনার একটি পাইথন রেডিস ক্লায়েন্টের দরকার হবে http://pypi.python.org/pypi/redis


1
উল্লেখ করা উচিত, এটি প্রক্রিয়া শেষ নয়, টিসিপি ব্যবহার করে অ্যাক্সেস করা দরকার।
জেফ্রি 15


2

এই প্রকল্পটির লক্ষ্য "মানুষের জন্য ক্যাচিং" সরবরাহ করা (যদিও এটি মোটামুটি অজানা বলে মনে হচ্ছে)

প্রকল্প পৃষ্ঠা থেকে কিছু তথ্য:

স্থাপন

পাইপ ইনস্টল ক্যাশে

ব্যবহার:

import pylibmc
from cache import Cache

backend = pylibmc.Client(["127.0.0.1"])

cache = Cache(backend)

@cache("mykey")
def some_expensive_method():
    sleep(10)
    return 42

# writes 42 to the cache
some_expensive_method()

# reads 42 from the cache
some_expensive_method()

# re-calculates and writes 42 to the cache
some_expensive_method.refresh()

# get the cached value or throw an error
# (unless default= was passed to @cache(...))
some_expensive_method.cached()


-5

কীরিং হলেন সেরা পাইথন ক্যাচিং লাইব্রেরি। তুমি ব্যবহার করতে পার

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

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

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

এটি একটি কীরিং লাইব্রেরি, ক্যাচিং লাইব্রেরি নয়।
স্ট্যাভ্রোস করোকিঠাকিস

বাস্তবিক @StavrosKorokithakis, আমি keyring মাধ্যমে কি ক্যাশে বাস্তবায়িত
IMP
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.