Có phải là "thực hành tốt" để tạo một lớp học như lớp dưới đây có thể xử lý quá trình ghi nhớ cho bạn không? Lợi ích của việc ghi nhớ rất tuyệt vời (trong một số trường hợp, như thế này, nó giảm từ 501003 xuống 1507 cuộc gọi hàm và từ 1.409 đến 0.006 giây của CPU trên máy tính của tôi) có vẻ như một lớp như thế này sẽ hữu ích.Trình xử lý ghi nhớ
Tuy nhiên, tôi chỉ đọc các nhận xét tiêu cực về cách sử dụng eval()
. Việc sử dụng nó có thể tha thứ được không, do sự linh hoạt mà cách tiếp cận này cung cấp?
Điều này có thể tự động lưu bất kỳ giá trị trả lại nào với chi phí làm mất các tác dụng phụ. Cảm ơn.
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()')
Bạn đang nói về "trình trang trí Python" và ghi nhớ là một cách sử dụng tuyệt vời cho chúng. Và nó không yêu cầu evals (mà là một phần xấu xa, bạn đã nghe chính xác). – msw