1. ホーム
  2. python

[解決済み] なぜ任意の(True for ... if cond)は任意の(cond for ...)よりずっと速いのですか?

2023-03-05 12:30:07

質問

リストが奇数を含むかどうかを確認する2つの類似した方法。

any(x % 2 for x in a)
any(True for x in a if x % 2)

によるタイミング結果 a = [0] * 10000000 (でのタイミング結果です(各5回ずつ、時間は秒単位)。

0.60  0.60  0.60  0.61  0.63  any(x % 2 for x in a)
0.36  0.36  0.36  0.37  0.37  any(True for x in a if x % 2)

なぜ2番目の方法はほぼ2倍の速さなのか?

私のテストコードです。

from timeit import repeat

setup = 'a = [0] * 10000000'

expressions = [
    'any(x % 2 for x in a)',
    'any(True for x in a if x % 2)',
]

for expression in expressions:
    times = sorted(repeat(expression, setup, number=1))
    print(*('%.2f ' % t for t in times), expression)

オンラインでお試しください

どのように解決するのですか?

最初の方法は、すべてを any() に送信し、2 番目のメソッドは any() には奇数の時のみ送信されます。 any() は通過する要素が少なくなります。