आप lru_cache
का उपयोग करके जो भी करना चाहते हैं वह नहीं कर सकते हैं, क्योंकि यह कैश तक पहुंचने के लिए एपीआई प्रदान नहीं करता है, और इसे भविष्य में रिलीज़ में सी में फिर से लिखा जा सकता है। यदि आप वास्तव में कैश को सहेजना चाहते हैं तो आपको एक अलग समाधान का उपयोग करना होगा जो आपको कैश तक पहुंच प्रदान करता है।
अपने आप को कैश लिखना काफी आसान है। उदाहरण के लिए:
from functools import wraps
def cached(func):
@wraps(func)
def wrapper(*args):
try:
return func.cache[args]
except KeyError:
func.cache[args] = result = func(*args)
return result
wrapper.cache = {}
return wrapper
फिर आप यह एक डेकोरेटर के रूप में आवेदन कर सकते हैं:
>>> @cached
... def fibonacci(n):
... if n < 2:
... return n
... return fibonacci(n-1) + fibonacci(n-2)
...
>>> fibonacci(100)
354224848179261915075L
और पुनः प्राप्त cache
:
>>> fibonacci.cache
{(32,): 2178309, (23,): 28657, ... }
आप कर सकते हैं तो अचार/कैश unpickle आप कृपया के रूप में और इसे लोड करें:
fibonacci.cache = pickle.load(cache_file_object)
मुझे पाइथन के अंक ट्रैकर में lru_cache
पर डंप/लोड जोड़ने के लिए मिला, लेकिन इसे स्वीकार/कार्यान्वित नहीं किया गया था। शायद भविष्य में lru_cache
के माध्यम से इन परिचालनों के लिए अंतर्निहित समर्थन होना संभव होगा।
नोट मुझे लगता है कि LRU कैश कार्यान्वयन अजगर 3.4 या 3.5 में एक सी कार्यान्वयन द्वारा प्रतिस्थापित किया जा रहा है, कैश सामग्री निकालने पर किसी भी प्रयास है शायद भविष्य के सबूत होने वाला नहीं है। –
@MartijnPieters: जानकारी के लिए धन्यवाद। –
बस 'lru_cache' से बचें। क्या आपके फ़ंक्शन के लिए 'lru_cache' या एक साधारण कैश होना महत्वपूर्ण है? अन्यथा आप 'lru_cache' को फिर से कार्यान्वित कर सकते हैं और अपनी इच्छित कार्यक्षमता जोड़ सकते हैं। – Bakuriu