5

ランダムネットワークのさまざまな統計分析を行ういくつかの高価な関数を永続的にメモ化するための小さなクラスを作成しました。

これらはすべて純粋関数です。すべてのデータは不変です。ただし、一部の関数は関数を引数として取ります。

Pythonでは、関数オブジェクトの同等性は関数オブジェクトIDと同等であり、関数の実装が変更されなくてもセッション間で持続しないため、これらの引数に基づいてキーを作成することは小さな問題です。

とりあえず関数名を文字列として使ってハッキングしていますが、関数や無名関数の実装を変更することなどを考え始めると、それ自体が問題になります。しかし、私はおそらくそのようなことを心配する最初の人ではありません。

Pythonで関数の引数を使用して関数を永続的にメモ化するための戦略はありますか?

4

2 に答える 2

3

1つのオプションは使用することですmarshal.dumps(function.func_code)

関数のコードの文字列表現を生成します。これは、実装と無名関数の変更を処理する必要があります。

于 2012-02-19T23:16:36.903 に答える
2

これを関数のアイデンティティとして使用することを見てください

[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']
]

何らかの方法で実装の変更を正しく処理する必要があります...

于 2012-02-19T23:12:02.203 に答える