Python中在函数内创建常量字典是否高效?
Python函数内的常量字典会被自动优化吗?
默认情况下,Python不会对这种函数内的常量字典做创建优化——每次调用check_map时,value_map都会被重新创建一个新的字典对象。
这是因为Python函数体的代码会在每次调用时逐行执行,字典字面量{"val1": ...}每次执行到都会生成一个新的实例,哪怕它的内容完全固定。
你可以用id()函数验证这一点:
def check_map(val): value_map = {"val1": "newval1", "val2": "newval2", "val3": "newval3"} print(id(value_map)) # 每次调用打印的id都不同,说明是新对象 val = value_map.get(val, val) return val check_map("val1") check_map("val2")
如果想避免重复创建字典,有几种常见的优化方式:
- 将字典移到函数外部(模块级常量)
这是最直观的方式,字典只会在模块加载时创建一次,后续函数调用直接复用:
# 模块级常量,仅初始化一次 value_map = {"val1": "newval1", "val2": "newval2", "val3": "newval3"} def check_map(val): val = value_map.get(val, val) # other stuff return val
- 利用函数默认参数的求值时机
Python的函数默认参数是在函数定义时求值的,而不是每次调用时。可以把字典作为默认参数传入(如果不想暴露给外部调用者,可以用一个私有参数名):
def check_map(val, _value_map={"val1": "newval1", "val2": "newval2", "val3": "newval3"}): val = _value_map.get(val, val) # other stuff return val
注意:这种方式仅限字典是完全不可变的场景,如果后续代码有修改这个字典的操作,会影响所有函数调用(因为所有调用共享同一个字典实例)。
内容的提问来源于stack exchange,提问作者planetp
相关产品推荐
相关产品推荐

