大きなコードベースと異なるツールで複数の読み込みが必要な場合があります。 それで、テキストが変わらない間にディスクで何度も読むのは本当に浪費だと思ったので、私は次のように書きました。ディスクのキャッシュ操作
class Module(object):
def __init__(self, module_path):
self.module_path = module_path
self._text = None
self._ast = None
@property
def text(self):
if not self._text:
self._text = open(self.module_path).read()
return self._text
@property
def ast(self):
s = self.text # which is actually discarded
if not self._ast:
self._ast = parse(self.text)
return self._ast
class ContentDirectory(object):
def __init__(self):
self.content = {}
def __getitem__(self, module_path):
if module_path not in self.content:
self.content[module_path] = Module(module_path)
return self.content[module_path]
しかし、この新しいトリックを使用することができながら、私は、コードの残りの部分を変更しないようしたいと思いますので、今では、問題が来ます。
私が見る唯一の方法は、例えば "open"組み込み関数をどこでも使えるようにパッチすることです。
from myotherlib import __builtins__ as other_builtins
other_builtins.open = my_dummy_open # which uses this cache
しかし、実際には賢明な考えのようには見えません。 私はあきらめて、パフォーマンスが本当にあまりにも悪いかもしれないかどうか試してみてください。
「私はあきらめ、パフォーマンスが多分本当にあまりにも悪い場合にのみ試みるべきでしょうか?」 - ほぼ確実にはい。 OSレベルでは、ファイルのキャッシュが処理されます。たとえば、OSよりもアクセスパターンをよく理解していればキャッシュできるだけの価値がありますが、実際に最初に実行する必要があるかどうかは常に確認する価値があります。 –
'parse()'は実際にどれくらい時間がかかりますか?再解析を何回保存するのですか?あなたのプロセス/コンピュータは、 '_ast'が実際には使用されているが使用されていないメモリを使って、もっと便利なことをすることができますか? – sarnold
OSは奇跡を起こすことはできません。小さなテストでは、キャッシュされたバージョンとキャッシュされていないバージョンの間に大きな違いがあります。 –