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

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

显然,这两个函数实现了相同的目标,但实现方式不同。有人可以帮助我理解两者之间的细微差别,以及继续解决这个问题的“最佳”方法是什么吗?

最佳答案

如果您在函数创建了两个字典,那么前者会更有效率——虽然前者在只需要一个计算时执行两个计算,但后者版本的开销更多每次调用时创建 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

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

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 函数对象的开销小于在只需要一个结果的情况下计算两个结果浪费了时间。

关于python - Python字典的推荐用法,函数作为值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29653009/

相关文章:

python - 对于两个数据帧,如何检索两个标签值的组合在一个数据帧中但不在另一个数据帧中的行

c++ - 在 Python 中扩展的 C++ 类中的段错误回调问题

python - Mac OS X 更新后损坏的 python

python - 如何从文件中将公共(public) RSA key 加载到 Python-RSA 中?

python - Flask - 在某些路由上不一致地获取 404

python - 如何在Python中按总位数(包括整数部分)而不是固定位数进行舍入?

python - 如何在 Python 中比较两个以上的列表?

python - PyQt 自定义数据结构

python - 使用 Python 从此 JSON 对象中提取嵌套列表

Python3 Antlr4属性错误: 'CommonToken' object has no attribute 'getLine'