私は、「list_l から x を削除しようとする」という単純なアクションの if / then ワークフローよりも、try / except ワークフローの方が高速であると想定しました。以下の例では、16.6% の確率で例外が発生する可能性があるにもかかわらず、例外の失敗 (x が list_l にない) は許可要求 (x が list_l にある場合) よりも多くの時間を要します。なんで?
私がコーディングしたテストとその結果は次のとおりです。
import random, time, timeit
class Timer(object):
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, *args):
self.end = time.time()
self.secs = self.end - self.start
self.msecs = self.secs * 1000 # millisecs
def a_function():
a_list = list(xrange(10))
choice_list = list(xrange(12))
choice = random.choice(choice_list)
try:
a_list.remove(choice)
except ValueError:
pass
def b_function():
a_list = list(xrange(10))
choice_list = list(xrange(12))
choice = random.choice(choice_list)
if choice in a_list:
a_list.remove(choice)
with Timer() as a:
print('test_a', timeit.timeit("a_function()", number=10000, setup="from __main__ import a_function"))
with Timer() as b:
print('test_b', timeit.timeit("b_function()", number=10000, setup="from __main__ import b_function"))
結果:
1st attempt: ('test_a', 0.029724836349487305)('test_b', 0.027068138122558594)
2nd attempt: ('test_a', 0.02960801124572754)('test_b', 0.026785850524902344)
3rd attempt: ('test_a', 0.029654979705810547)('test_b', 0.02665996551513672)
また、choice_list の範囲を 20 に増やすと、例外がより頻繁に発生するため、差が広がります。Python が許可を求めずに許すことを強く要求する場合、失敗すると時間の面でコストがかかるように見えるのはなぜですか?