为什么这个函数使用dicts比“if”慢?

2024-09-30 14:21:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白为什么使用dicts的函数比“if”慢,有人能解释一下为什么/并给我一个比“ifx3”更快、更具python风格的方法吗(如果长期需要更多的比较,这会变得更糟)

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

Tags: returnifdeftablecodefnstrtimeit
1条回答
网友
1楼 · 发布于 2024-09-30 14:21:52

正如Chris Doyle指出的,通过在fn函数中调用.get(),您正在进行另外4个函数调用。这是一个更好的比较:

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

相关问题 更多 >