我正在寻找一些帮助,了解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)
显然,这两个功能实现了相同的目标,但是通过不同的方式。有人可以帮助我理解两者之间的细微差别,以及最好的'关于这个的方法会是什么?
答案 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)
您的计算定义全部存储在一起,您的函数调用整洁而有意义。