Просто на основе простых экспериментов с кодом, подобным:
_w= ['a', 'b', 'c', 'd', 'e']
d= {}
w= []
for k in xrange(123):
for word in _w:
wk= word+ str(k)
d[wk]= k
w.append(wk)
def m1():
for word in w:
if word in d:
pass
def m2(n= 1):
dk= d.keys()
for word in w:
if word in dk:
pass
и временем:
In []: len(w)
Out[]: 5
In []: %timeit m1()
1000000 loops, best of 3: 657 ns per loop
In []: %timeit m2()
1000000 loops, best of 3: 1.55 us per loop
In []: len(w)
Out[]: 615
In []: %timeit m1()
10000 loops, best of 3: 49.2 us per loop
In []: %timeit m2()
100 loops, best of 3: 5.62 ms per loop
Вывод будет таким: m1 () - явный победитель (как и ожидалось; -).
Хорошо, это не совсем доказательство (в строгом смысле) превосходства m1()
.Все еще существует небольшая вероятность того, что кто-то определит набор ключей, в которых время выполнения m1()
и m2()
близко друг к другу (но я не могу найти ни одного случая, когда m1()
будет на самом деле намного хуже, чем m2()
).На практике m1()
подход всегда побеждает.Всегда воодушевлено опробовать первые убедительные факты альтернативных подходов, а затем, если что-то противоречит вашим ожиданиям, вы будете более готовы выяснить, почему это происходит.