Я просматривал код раньше, и разработчик написал inline if
/else
, а не get()
, чтобы получить элемент из списка, если он существует (в противном случае это значение по умолчанию). Я решил весить код timeit
на repl и был довольно смущен результатом. if
/else
занимает 1/3 времени get()
.Почему inline if/else быстрее, чем .get() в Python?
Here is the repl code, и ниже приведен код в REPL, а также результат для потомства:
import timeit
D = {"a": 1, "b": 2, "c": 3}
def ef(): return D['a'] if 'a' in D else 1
def gt(): return D.get('a', 1)
print "gt1", timeit.timeit(gt, number=10000)
print "ef1", timeit.timeit(ef, number=10000)
print "ef2", timeit.timeit(ef, number=10000)
print "gt2", timeit.timeit(gt, number=10000)
и результаты:
gt1 0.0659999847412
ef1 0.0239999294281
ef2 0.0249998569489
gt2 0.0539999008179
и визуальный 10 итераций выше timeit
звонки, где результат был умножен на 10000 для целей представления
Почему не было бы быстрее? Я почти всегда ожидал, что встроенный синтаксис языка будет быстрее, чем вызов метода. – Ajedi32
Вы правы в предположении. Я просто ожидал, что встроенная функция будет иметь меньшие накладные расходы в словаре, чем условное, где мы должны ссылаться на значение словаря. – jsanc623
Правильно, но функции, очевидно, придется ссылаться и на значение словаря, верно? В противном случае, как бы вернуть значение, когда ключ существует? – Ajedi32