可爱的 Python: 用基于生成器的状态机和协同程序增加效率
2007-03-29 12:05:22 来源:WEB开发网核心提示:Python 2.2 中引进的简单生成器可用于简化状态机以及模仿协同程序,David 在“可爱的 Python”专栏较早前的一个部分中介绍了一个 状态机处理的抽象模式,可爱的 Python: 用基于生成器的状态机和协同程序增加效率,从那时起,简单生成器的引进就为描述机器提供了一些更自然的范例,如
Python 2.2 中引进的简单生成器可用于简化状态机以及模仿协同程序。David 在“可爱的 Python”专栏较早前的一个部分中介绍了一个 状态机处理的抽象模式。从那时起,简单生成器的引进就为描述机器提供了一些更自然的范例。协同程序是一种“外来”流机制,广泛使用的语言几乎都不支持这种机制(甚至连非 Stackless Python 都不支持它)。然而,Python 的新生成器 几乎完全支持协同程序,几乎不用模仿任何额外的步骤。在本文中,David 通过说明性代码样本解释了所有相关概念。
您需要花上一段时间才能完全“了解”Python 2.2 的新生成器。即使在“可爱的 Python”前面一部分中已经写过了 介绍简单生成器,我还是不能说已经完全理解了生成器的“完整结构(gestalt)”。本文介绍了一些供生成器使用的附加模式,并且希望它能让我本人和读者更深入地了解“可恢复函数”这一理念体系。
简单生成器有许多优点。生成器除了能够用更自然的方法表达一类问题的流程之外,还极大地改善了许多效率不足之处。在 Python 中,函数调用代价不菲;除其它因素外,还要花一段时间解决函数参数列表(除了其它的事情外,还要分析位置参数和缺省参数)。初始化框架对象还要采取一些建立步骤(据 Tim Peters 在 comp.lang.python 上所说,有 100 多行 C 语言程序;我自己还没检查 Python 源代码呢)。与此相反,恢复一个生成器就相当省力;参数已经解析完了,而且框架对象正“无所事事地”等待恢复(几乎不需要额外的初始化)。当然,如果速度是最重要的,您不应该使用字节码已编译过的动态语言;但即使在速度不是主要考虑因素的情况下,快点总比慢点好。
更多精彩
赞助商链接