यह "अच्छा अभ्यास" है कि नीचे एक आप के लिए Memoization प्रक्रिया संभाल कर सकते हैं की तरह एक वर्ग बनाने के लिए है? Memoization के लाभों को इतना महान है कि ऐसा लगता है इस तरह एक वर्ग उपयोगी होगा (यह एक है, जहां यह 501,003 ने 1507 से समारोह कॉल करने के लिए और अपने कंप्यूटर पर CPU समय का 1.409 0.006 सेकंड से चला जाता है की तरह है, कुछ मामलों में) कर रहे हैं।Memoization हैंडलर
हालांकि, मैं eval()
के उपयोग पर केवल नकारात्मक टिप्पणी पढ़ा है। क्या यह उपयोग इस पहुंच के लचीलेपन के कारण, यह उपयोग करने योग्य है?
इस दुष्प्रभाव को खोने की कीमत पर स्वचालित रूप से किसी भी दिए गए मान बचा सकता है। धन्यवाद।
import cProfile
class Memoizer(object):
"""A handler for saving function results."""
def __init__(self):
self.memos = dict()
def memo(self, string):
if string in self.memos:
return self.memos[string]
else:
self.memos[string] = eval(string)
self.memo(string)
def factorial(n):
assert type(n) == int
if n == 1:
return 1
else:
return n * factorial(n-1)
# find the factorial of num
num = 500
# this many times
times = 1000
def factorialTwice():
factorial(num)
for x in xrange(0, times):
factorial(num)
return factorial(num)
def memoizedFactorial():
handler = Memoizer()
for x in xrange(0, times):
handler.memo("factorial(%d)" % num)
return handler.memo("factorial(%d)" % num)
cProfile.run('factorialTwice()')
cProfile.run('memoizedFactorial()')
आप के बारे में "अजगर सज्जाकार" और Memoization बात कर रहे हैं उनके लिए एक शानदार इस्तेमाल होता है। और इसके लिए evals की आवश्यकता नहीं है (जो आंशिक रूप से बुराई है; आप सही ढंग से सुना है)। – msw