`

speeding up python

阅读更多

python确实是十分慢的语言,有多慢?不好说,我测试过一些非io相关的程序,比java慢大约50倍是有的,比c++只会更慢(除了string操作外)

 

幸好python从来不缺各种工具,对于加快速度的工具选择更是丰富。数了一下有: pypy, psyco, cython,swig,pyrex等等。

 

这些工具的一个核心抽象说来只有一点:找出慢的部分然后把它变快。 直观的做法是把慢的部分变为c。。。通常一套程序和速度相关的部分只有20%是关键,把它优化了也就差不多了。另外一种做法就是jit了。直接变为机器码。

 

对于上述的这些工具曾经做过一番试用,总结下来如果需要考虑到易用性,跨平台性还有兼容性那么只有cython & swig满足这个要求。其他的方案总有些限制,故此暂时不作考虑。

 

 

cython  swig哪个更好? 这个不好说。

 

cython可以提供更细粒度的交互,好比.net 下的 c++/cli。可以把py和c代码混用。能更方便控制性能部分的范围。

 

swig相当于P/Invoke

 

swig只能通过函数和class一级的调用,而且会生成额外的wrapper。性能上有一定损耗,而且wrapper本身未必能符合使用要求,最常见的做法还是引入类似pimpl技法,又封装一层。有时候看起来有些臃肿,cython本身没有这个问题

 

使用 cdef class 可以直接实现想要的接口。

 

不过cython使用的难度高于swig。后者只需要swig,a working compiler。py本身都不需要。适合封装原有的库。

而且swig本身支持十分多的语言,新版本2.0.4对py做了专门的优化,如果是想快速封装原有的库,用swig是不错的选择。

 

cython需要自行实现setup.py, 需要制作起码的pyx, pyd,语法方面需要花额外的时间去理解,不如swig直观。但是cython有个优点是可以把pure py code变为c的代码。 我测试过手头用的几何计算的函数,简单把py code变为c 可以

获得大约30%的提升,不用改一行代码,很可观。

 

对于新应用,会逐渐改用cython来实现。swig只保留用作兼容用途 或者给其他语言共用。

 

这两者都支持windows平台。我发现一个有趣的现象,在py里面,一般来说只要能在windows下用的,跨平台就不成问题。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics