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

时间:2015-04-15 14:29:26

标签: 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)

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

4 个答案:

答案 0 :(得分:3)

如果你在里面创建了两个字典,那么前者将更有效 - 虽然前者只需要一个时执行两次计算,但后一版本的开销更多每当它被称为

时创建lambdas
>>> 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

但是,如果您将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)

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

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

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

答案 1 :(得分:1)

字典完全没有意义,因为你需要在每次通话时重新创建它,但你所做的只是一次查找。 Juse使用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)

答案 2 :(得分:0)

尽管两者都达到了同样的目的,但第一部分更具可读性和更快性。

在你的第一个例子中,你有一个简单的算术运算,一旦调用convert_to_celsius就会计算出来。

在第二个示例中,您只计算 所需的温度。

如果你有第二个函数执行昂贵的计算,那么使用函数可能是有意义的,但是对于这个特定的例子,它不是必需的。

答案 3 :(得分:0)

正如其他人所指出的那样,你的选择都不理想。第一个每次都进行两次计算,并且有一个不必要的字典。第二个必须每次创建lambdas。如果这个例子是目标,那么我同意unwind来使用if语句。如果目标是学习可以扩展到其他用途的东西,我喜欢这种方法:

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

newtemp = convert_to_celsius[source](temp)

您的计算定义全部存储在一起,您的函数调用整洁而有意义。