Python字典的推荐用法,作为值的功能

chu*_*ngh 7 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)
Run Code Online (Sandbox Code Playgroud)

显然,这两个功能实现了相同的目标,但是通过不同的手段.有人能帮助我理解两者之间的细微差别,以及关于这个的"最佳"方式是什么?

jon*_*rpe 3

如果在函数内部创建了两个字典,那么前者会更有效 - 尽管前者在只需要一个计算时执行两次计算,但后一个版本在每次调用时创建 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
Run Code Online (Sandbox Code Playgroud)

lambda但是,如果将s的字典移到函数之外:

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)
Run Code Online (Sandbox Code Playgroud)

那么后者更有效,因为lambda对象仅创建一次,并且该函数仅在每次调用时进行必要的计算:

>>> timeit.timeit("convert_to_celsius_lambda_once(100, 'kelvin')", setup=setup)
0.3904035060131186
Run Code Online (Sandbox Code Playgroud)

请注意,这仅在函数被多次调用(在本例中为 1,000,000 次)时才有好处,因此创建两个lambda函数对象的开销小于仅需要一个结果时计算两个结果所浪费的时间。