6

timeit モジュールのコードを読んでいて、次のセグメントに気付きました。

gcold = gc.isenabled()
gc.disable()
timing = self.inner(it, self.timer)
if gcold:
    gc.enable()

これは、ガベージ コレクションの状態 (オンまたはオフ) を格納し、それをオフにします。この関数innerは、タイミングを計ってステートメントを実行します。次に、ガベージ コレクターを古い状態に戻します。

だから私はこれのポイントが何であるかについて興味があります。テストされているコードがガベージ コレクターで動作する場合、それはテストに反映されるべきではありませんか? 私は何が欠けていますか?

4

2 に答える 2

6

確かにそのコードはこのように書かれるべきですか?

gcold = gc.isenabled()
gc.disable()
try:
    timing = self.inner(it, self.timer)
finally:
    if gcold:
        gc.enable()

それ以外の場合、時間指定されたコードが例外をスローした場合、ガベージ コレクションは無効のままになります。

これは bugs.python.orgで報告し、Python 2.7.3 および 3.2.2 で修正されました。

于 2011-07-07T15:00:24.693 に答える
6

ガベージ コレクションの性質上、その頻度と期間は予測できません。少なくとも特定のコード チャンクのパフォーマンスの観点からは、ガベージ コレクターは統計にノイズを追加するだけです。

プログラム全体の観点からは、ガベージ コレクターが実行されているシステムでプログラムが実行されている場合は、プログラムのパフォーマンスを測定するときに考慮に入れる必要があるという点で正しいです。しかし、通常、個々の機能について考慮されることはありません。

于 2010-12-24T02:19:40.287 に答える