ループ内で変化しない条件を確認する必要がある場合があります。これは、テストが反復ごとに評価されることを意味しますが、これは正しい方法ではないと思います。
ループ内で条件が変わらないので、ループ外で一度だけテストする必要があると思いましたが、「自分自身を繰り返す」必要があり、おそらく同じループを複数回記述する必要があります。ここに私が何を意味するかを示すコードがあります:
#!/usr/bin/python
x = True #this won't be modified inside the loop
n = 10000000
def inside():
for a in xrange(n):
if x: #test is evaluated n times
pass
else:
pass
def outside():
if x: #test is evaluated only once
for a in xrange(n):
pass
else:
for a in xrange(n):
pass
if __name__ == '__main__':
outside()
inside()
前のコードで実行cProfile
すると、次の出力が得られました。
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.542 0.542 0.542 0.542 testloop.py:5(inside)
1 0.261 0.261 0.261 0.261 testloop.py:12(outside)
1 0.000 0.000 0.803 0.803 testloop.py:3(<module>)
これは明らかに、ループの外側で 1 回テストするとパフォーマンスが向上することを示していますが、同じループを 2 回 (いくつかelif
s がある場合はさらに多く) 記述しなければなりませんでした。
ほとんどの場合、このパフォーマンスは問題にならないことはわかっていますが、この種のコードを記述する最善の方法を知る必要があります。たとえば、python にテストを 1 回だけ評価するように指示する方法はありますか?
どんな助けでも大歓迎です、ありがとう。
編集:
実際にいくつかのテストを行った後、パフォーマンスの違いは主に、テストの評価ではなく、ループ内で実行される他のコードの影響を受けると確信しました。したがって、今のところ、最初の形式に固執しています。この形式の方が読みやすく、後でデバッグするのに適しています。