Python字典的推荐用法,函数作为值

2024-05-14 05:47:28 发布

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

我正在寻找一些帮助来理解Python中字典的最佳实践。你知道吗

我举了一个例子:

def convert_to_celsius(temp, source):
    conversion_dict = {
        'kelvin': temp - 273.15,
        'romer': (temp - 7.5) * 40 / 21
    }
    return conversion_dict[source]


def convert_to_celsius_lambda(temp, source):
    conversion_dict = {
        'kelvin': lambda x: x - 273.15,
        'romer': lambda x: (x - 7.5) * 40 / 21
    }
    return conversion_dict[source](temp)

显然,这两个功能实现了相同的目标,但通过不同的方式实现。有没有人能帮我理解这两者之间的细微差别,以及“最好”的方法是什么?你知道吗


Tags: tolambda功能sourceconvertreturn字典def
3条回答

尽管两者实现了相同的功能,但第一部分的可读性更强,速度更快。你知道吗

在第一个示例中,您有一个简单的算术运算,一旦调用convert_to_celsius就会计算这个运算。你知道吗

在第二个例子中,只计算所需的温度。你知道吗

如果你让第二个函数做一个昂贵的计算,那么使用一个函数来代替可能是有意义的,但是对于这个特殊的例子,它不是必需的。你知道吗

如果您在函数中创建了两个字典,那么前者的效率会更高-尽管前者在只需要一个字典的情况下执行两个计算,但是在后一个版本中,每次调用lambda时创建lambda的开销会更大:

>>> import timeit
>>> setup = "from __main__ import convert_to_celsius, convert_to_celsius_lambda, convert_to_celsius_lambda_once"
>>> timeit.timeit("convert_to_celsius(100, 'kelvin')", setup=setup)
0.5716437913429102
>>> timeit.timeit("convert_to_celsius_lambda(100, 'kelvin')", setup=setup)
0.6484164544288618

但是,如果将lambdas的字典移到函数外部

CONVERSION_DICT = {
    'kelvin': lambda x: x - 273.15,
    'romer': lambda x: (x - 7.5) * 40 / 21
}

def convert_to_celsius_lambda_once(temp, source):
    return CONVERSION_DICT[source](temp)

后者效率更高,因为lambda对象只创建一次,函数只对每个调用进行必要的计算:

>>> timeit.timeit("convert_to_celsius_lambda_once(100, 'kelvin')", setup=setup)
0.3904035060131186

请注意,这只在函数被大量调用(在本例中为1000000次)的情况下才是一个好处,因此创建两个lambda函数对象的开销比只需要一个结果时计算两个结果所浪费的时间要少。你知道吗

字典是完全没有意义的,因为你需要在每次调用时重新创建它,但你所做的只是一次查找。请使用if

def convert_to_celsius(temp, source):
    if source == "kelvin": return temp - 273.15
    elif source == "romer": return (temp - 7.5) * 40 / 21
    raise KeyError("unknown temperature source '%s'" % source)

相关问题 更多 >