Python从Tuple生成映射实现Transition类next方法更新State的优化问询
需求背景
你需要实现Transition类的def next(self, state: State) -> State方法,调用state.next(**参数)完成状态更新,规则是每个action依次更新状态,state.next负责执行实际的状态更新逻辑。
现有基础代码如下:
class Transition(object): actions: Tuple[Action] def next(self, state: State) -> State: return state.next(**{something})
打印self.actions的输出结果为:
(Assign(variable='a', value_or_variable=False), Assign(variable='c', value_or_variable=True))
最终要实现的效果等价于依次调用:
state.next(**{'a' : False}) state.next(**{'c' : True})
其中State类内部包含dict[str, Any]结构存储状态值。你已经实现了如下可行方案,希望找到更简洁高效的写法:
for x in self.actions: state = x.next(state) return state
可选优化方案
方案1:reduce一行实现(逻辑完全等价,写法最简洁)
直接用Python内置的functools.reduce迭代应用所有action,和原有循环逻辑100%等价,性能差异可以忽略:
from functools import reduce def next(self, state: State) -> State: return reduce(lambda s, action: action.next(s), self.actions, state)
方案2:合并参数单次调用(性能更高,仅适用于无依赖场景)
如果多个action之间没有依赖(后一个action的取值不需要用到前一个action更新后的状态),可以把所有更新参数合并成一个字典,只调用一次state.next,减少方法调用开销:
def next(self, state: State) -> State: update_params = {act.variable: act.value_or_variable for act in self.actions} return state.next(**update_params)
注意:如果action之间有前后依赖,该方案不可用。
方案3:保留原有循环
你目前的循环写法可读性、性能都已经足够优秀,如果不想引入额外依赖,完全可以继续使用原实现,不需要额外修改。
内容的提问来源于stack exchange,提问作者Albin Ekström
相关产品推荐
相关产品推荐

