https://repl.it/@ArmanTavakoli/List-Comprehension-vs-Any
彼らが本質的に同じことをしているany
のに、なぜ私のチェックは私のチェックよりもはるかに速いのin
ですか?
from timeit import default_timer as timer
import random
input = [random.randint(0, 100) for x in range(0, 1000000)]
def any_check(input):
return any(i == 1 for i in input)
def list_comprehension(input):
return 1 in [num for num in input]
first_start = timer()
any_check(input)
first_end = timer()
print('any_check', first_end - first_start)
second_start = timer()
list_comprehension(input)
second_end = timer()
print('list_comprehension', second_end - second_start)
関数をそれぞれ3回実行した結果。
# Calculated with 3 runs each
# Ratio is list_comprehension:any_check
# 10,000 - Mean Ratio: 17.87
# Example run;
# any_check 1.5022000297904015e-05
# list_comprehension 0.00038980199315119535
# 100,000 - Mean Ratio: 140.76
# any_check 2.020499960053712e-05
# list_comprehension 0.0035961729954578914
# 1,000,000 - Mean Ratio: 3379.81
# any_check 2.2904998331796378e-05
# list_comprehension 0.08528400499926647
コメントで指摘されているように、in
テストを実行any
する関数が使用するバージョンよりも遅い理由は、その関数には、オペレーターが一致を探し始める前に入力全体を反復する必要がある不要なリスト内包表記も含まれin
ているためです。リストで実行すると、in
とany
が短絡する可能性があり、検索の早い段階で一致する値が見つかった場合は早期に終了します。ただし、2番目の関数のリスト内包表記は1
、最初に権利があったとしても、常に入力全体を繰り返し処理します。
あなたが交換した場合1 in [num for num in input]
に1 in input
、あなたは良いとしても、より良い使用して、機能よりもパフォーマンスを参照してくださいねany
。input
リストの場合、パフォーマンスはかなり似ていますが、他のコンテナタイプ(set
sやrange
sなど)の場合ははるかに高速になる可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加