5

Tôi đã viết một lớp nhỏ để liên tục ghi nhớ một số hàm đắt tiền thực hiện phân tích thống kê khác nhau của các mạng ngẫu nhiên.Python: các chiến lược cho các hàm ghi nhớ liên tục với các đối số hàm?

Đây là tất cả các hàm thuần túy; tất cả dữ liệu đều không thay đổi. Tuy nhiên, một số hàm có chức năng làm đối số.

Tạo khóa dựa trên các đối số này là một vấn đề nhỏ, vì trong hàm đối tượng hàm Python tương đương với nhận dạng đối tượng hàm, không tồn tại giữa các phiên, ngay cả khi việc triển khai hàm không thay đổi.

Tôi đang bẻ khóa xung quanh việc này bằng cách sử dụng tên hàm dưới dạng chuỗi, nhưng điều này làm nảy sinh các vấn đề của riêng nó khi bắt đầu suy nghĩ về việc thay đổi chức năng hoặc chức năng ẩn danh. Nhưng tôi có lẽ không phải là người đầu tiên lo lắng về những thứ như vậy.

Có ai có bất kỳ chiến lược nào để liên tục ghi nhớ các hàm với các đối số hàm trong Python không?

+0

bản sao có thể có của [Ghi nhớ liên tục trong Python] (http://stackoverflow.com/questions/9320463/persistent-memoization-in-python) –

+2

@DanatheSane không trùng lặp --- nó không thảo luận về ghi nhớ liên tục giữa các lời gọi trong đó hàm là đối số cho hàm được ghi nhớ. – tobyodavies

Trả lời

2

Có xem xét sử dụng này là bản sắc của hàm

[getattr(func.__code__,s) 
for s in ['co_argcount', 'co_cellvars', 'co_code', 'co_consts', 
      'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 
      'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 
      'co_varnames'] 
] 

rằng nên xử lý một cách chính xác thay đổi thực hiện trong bất kỳ cách nào ...

+0

Cảm ơn. Tôi nghĩ rằng một cái gì đó như thế này đệ quy trên các chức năng ghi nhớ trong 'co_names' nên làm điều đó. Tôi đã rất ngạc nhiên khi 'co_code' giống nhau trên một số nền tảng khác nhau và các phiên bản python trong thử nghiệm ban đầu của tôi. Tôi đoán tôi cần phải đọc trên máy ảo Python. –

+0

Có thể một công việc tương tự cho các đối tượng chung có thể gọi được không? Trong khi tránh các tạp chất chẳng hạn như tên toàn cầu là tốt, việc cấm sử dụng bất kỳ cuộc gọi nào khác ngoài một chức năng sẽ là không mong muốn nếu nó có thể được giúp đỡ. – max

+0

@max không, nó sẽ không. Nó sẽ không thể làm điều này nói chung là những gì tạo thành một sự thay đổi trong việc thực hiện một cuộc gọi chung được xác định bởi các lớp học mà có thể gọi. Điều gần nhất bạn có thể hy vọng là lớp học có thể lựa chọn hoặc sắp xếp hợp lý sao cho các biểu diễn không giống nhau giữa các thay đổi thực hiện. Ngoài ra, bạn có thể có giao thức riêng của mình để xác định phiên bản thực hiện của một người gọi. – tobyodavies

3

Một lựa chọn sẽ được sử dụng marshal.dumps(function.func_code)

Nó sẽ tạo ra một chuỗi đại diện cho mã của hàm. Điều đó sẽ xử lý các thay đổi triển khai và các chức năng ẩn danh.

Các vấn đề liên quan