Почему эта функция использует dicts медленнее, чем if? - PullRequest
1 голос
/ 10 июля 2020

Я не понимаю, почему эта функция с использованием dicts работает медленнее, чем «if», может ли кто-нибудь объяснить мне, почему / и дать мне более быстрый и более питонный c способ, чем «if x 3» (что станет хуже, если в конечном итоге требуется больше сравнений)?

import timeit
timeit.timeit("""
... conv_table = {'USEWR': 'USNYC',
...               'PAMIT': 'PACTB',
...               'NLMSV': 'NLRTM'}
... def fn(code: str):
...     # conversion for those values:
...     return conv_table.get(code, code)
... fn('USEWR')
... fn('PAMIT')
... fn('NLMSV')
... fn('XYZ')
... """)
0.6174538989998837

И тот, который быстрее, но с использованием "if":

timeit.timeit("""
... def fn(code: str):
...     if code == 'USEWR':
...         return 'USNYC'
...     if code == 'PAMIT':
...         return 'PACTB'
...     if code == 'NLMSV':
...         return 'NLRTM'
...     return code
... fn('USEWR')
... fn('PAMIT')
... fn('NLMSV')
... fn('XYZ')
... """)
0.5126422860003004

1 Ответ

1 голос
/ 10 июля 2020

Как указал Крис Дойл, вы выполняете еще 4 вызова функций, вызывая .get() в своей функции fn. Это было бы лучшее сравнение:

timeit.timeit("""
conv_table = {'USEWR': 'USNYC',
              'PAMIT': 'PACTB',
              'NLMSV': 'NLRTM'}
conv_table.get('USEWR', 'USEWR')
conv_table.get('PAMIT', 'PAMIT')
conv_table.get('NLMSV', 'NLMSV')
conv_table.get('XYZ', 'XYZ')
""")
# 0.31812165299925255

timeit.timeit("""
def fn(code: str):
    if code == 'USEWR':
        return 'USNYC'
    if code == 'PAMIT':
        return 'PACTB'
    if code == 'NLMSV':
        return 'NLRTM'
    return code
fn('USEWR')
fn('PAMIT')
fn('NLMSV')
fn('XYZ')
""")
# 0.49393055400287267
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...