用Psyco让Python运行得像C一样快
2007-11-12 12:52:53 来源:WEB开发网也就是说,从 Psyco 的观点来看,有趣的事情在类 bpnn.NN 之中。把 psyco.jit() 或 psyco.bind(NN2) 添加到 code_recognizer.py 脚本中起不了什么作用。要使 Psyco 进行期望的优化,需要将 psyco.bind(NN) 添加到 code_recognizer.py 或者将 psyco.jit() 添加到 bpnn.py。与您可能假设的情况相反,即时优化不在创建实例时或方法运行时发生,而是在定义类的作用域内发生。另外,绑定派生类不会专门化其从其它地方继承的方法。
一旦找到适当的 Psyco 绑定的细微的详细信息,那么加速效果是相当明显的。使用参考文章中提供的相同测试用例和训练方法(500 个训练模式,1000 个训练迭代),神经网络训练时间从 2000 秒左右减到了 600 秒左右 - 提速了 3 倍多。将迭代次数降到 10,加速的倍数也成比例降低(但对神经网络的识别能力无效),迭代的中间数值也会如此变化。
我发现使用两行新代码就能将运行时间从超过半小时减到 10 分钟左右,效果非常显著。这种加速仍可能比 C 编写的类似应用程序的速度慢,而且它肯定比几个独立的 Psyco 测试用例所反映出的 100 倍加速要慢。但是这种应用程序是相当“真实的”,而且在许多环境中这些改进已经是够显著的了。
Psyco 将何去何从?
Psyco 现在不执行任何类型的内部统计或概要分析,只对生成的机器码进行最小优化。可能今后的版本会知道如何针对那些能真正最大获益 Python,并且丢弃为不可优化部分高速缓存的机器码。另外,也许今后的 Psyco 可能会决定对费力运行的操作进行更广泛(但也更昂贵)的优化。这种运行时分析可能类似于 Sun 的 HotSpot 技术为 Java 所做的工作。Java 不像 Python,它有类型声明,但这一事实实际上没有许多人所设想的那样重要(但是先前在 Self、Smalltalk、Lisp 和 Scheme 的优化方面所做的工作也说明了这一点)。
若将 Psyco 类型的技术集成到 Python 本身的某个未来版本中去,会多么令人激动,尽管我怀疑这永远不会真正发生。添加几行导入和绑定代码不需要做很多工作,但却可以轻易地让 Python 比以前运行得快得多。我们将看到这一点。
更多精彩
赞助商链接