Pyrex 扩展并加速 Python 应用程序
2007-03-29 12:21:49 来源:WEB开发网清单 12. 查找素数的 Pyrex 函数def primes(int kmax):
# Calculate initial prime numbers
cdef int n, k, i
cdef int p[100000]
result = []
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % p[i] <> 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
return result
我也编写了一个与实际的 Python 函数相同的函数,基本来说,只是去掉这些声明。运行这个函数的 Pyrex 和 Python 两个版本,以及 Psyco 化的 Python 版本,所需要的时间如下:
清单 13. Python、Psyco 和 Pyrex 版本的查找素数的函数的运行时间$ ./prime_test.py
Pure Python version
First 10000 primes
60.30 seconds
Psyco-ized Python
First 10000 primes
7.62 seconds
Pyrex version
First 10000 primes
1.31 seconds
因此,在最佳情况中,Pyrex 比 Python 会好很多,加速情况也比 Psyco 要好。然而,我有一些程序可以通过修改一些算法的细节来提高 Psyco 的速度。即便如此,Pyrex 几乎肯定可以代表这种问题的最佳状况。所生成的 C 代码几乎与您使用 C 编写的代码完全相同。
结束语
Pyrex 有很多功能都实现得非常好。对于在循环中使用简单的数字或字符数据的代码来说,Pyrex 的加速效果非常明显,在最佳情况中,可能会是 50 倍。如果 Python 应用程序碰到数值函数方面的明显瓶颈,为这些函数创建一个 Pyrex 版本就非常有意义。但是在有些情况中,您会发现要想获得明显的提升是非常有限的。花费大部分时间在库函数调用上的代码不会像那些简单循环任务一样使用 Pyrex 可以获得明显的加速。而且,在很多情况中,增加两行代码启用 Psyco 就可以达到将 Python 代码中度修改为 Pyrex 所能达到的加速效果。虽然 Pyrex 代码很容易编写,但是您必须 编写 这些代码,这一点与 Psyco 不同。
我要说明本文中的 hashcash 可能不是您最想要的例子。我相信(经过更多工作之后)可以修改 Python sha 模块来启用直接调用 C 级接口的功能,这样就可以避免 Python 级的调用开销。也可能会找到更加优化的 SHA-1 的 C 实现。Pyrex 代码可以很完美地利用外部的 C 代码,调用使用 C 编写的 sha() 函数会比在 Python 对象和名称空间中装箱和拆箱该函数的速度更快。不过,如果有一个非常好的 hashcash 的现有 C 实现,就不知道这样做是否值得了。
然而,在使用 Pyrex 编写特殊的数值函数时,另外一个需要考虑的选项是是否可以使用 Numerical Python 作为工具。numeric 包非常通用,处理的速度也非常快。使用 numeric,终端用户并不需要涉及 任何 非 Python 代码,只需调用适当的库函数即可。尽管 numeric 的涵盖面当然与可以利用 Pyrex 的函数不同,但是肯定会有一些重叠。
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››加速点播 迅雷XMP全面提升在线视频播放速度
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
更多精彩
赞助商链接