1

私は現在、非常に大きなファイルをメモリにロードし、使用する前に高価なセットアップ操作を行う必要があるコードを c++ から python に移植しています。このコードでは、大きなルックアップ テーブルを使用して、タイム クリティカルな関連関数のグループの実行時間を短縮しています (5 つを超える関数がこの同じテーブルを広範囲に使用しています)。この状況は、コードの単体テストでうまく処理されていると思います。

class LookupTableTests(object):                                                                   

    @classmethod                                                                                  
    def setup_class(cls):                                                                         
        """Load the lookup table instance used by the rest of the tests.                          
        """                                                                                       
        from fasteval import LookupTable                                                                                                             
        cls.lt = LookupTable.loadfile()                                                       

    @classmethod                                                                                  
    def teardown_class(cls):                                                                      
        """Free the lookup table instance used in these tests.                                    
        """                                                                                       
        cls.lt.close()                                                                            
        cls.lt = None                                                                             

単体テストのコンテキストでは、これは私にとって非常に理にかなっています。一度テーブルをセットアップしてから一連のテストを実行すると、全体として実行時間が大幅に節約されます (このテーブルをロードして他の初期化を行うのは遅いです)。

ただし、単体テスト以外では、ルックアップ テーブルを使用する関数のグループ全体に対して、セットアップとクリーンアップが 1 回だけ実行されるようにする最適な方法がわかりません。

これまでのところ、セットアップが実行されたかどうかを示すグローバルを定義することをお勧めします。しかし、これは私には醜いように思えます。また、未処理の例外がどこかでスローされた場合、クリーンアップが適切に処理されないという問題も発生します。これを c++ で行っていた場合、RAII の原則を使用して、リソースを管理するためにデストラクタでクリーンアップを実行しようとしていると思いますが、Python でこれを行う適切な方法がわかりません。

すべて同じセットアップとクリーンアップを必要とする関連関数のグループがある状況に対処する Pythonic の方法は何ですか? このソリューションはどのような構造になりますか?

4

1 に答える 1