文章目录
  1. 1. 一、首先安装pyrex
  2. 2. 二、然后编写代码
    1. 2.1. 1.foo.py
    2. 2.2. 2.setup.py
  3. 3. 三、编译成pyd
    1. 3.1. 1.windows下编译
    2. 3.2. 2.linux下编译
  4. 4. 四、测试速度
    1. 4.1. 测试脚本test.py
    2. 4.2. 1.未使用pyrex
    3. 4.3. 2.使用了pyrex

pyrex可以用来生成C语言代码,并编译成python的扩展。pyrex的语法类似于python,但在里面有C语法的类型声明之类的东西。

一、首先安装pyrex

1
pip install pyrex

二、然后编写代码

1.foo.py

1
2
3
4
5
6
7
8
9
10
def run():
b = 0
i = 0
while i < 10000000:
if i%2 == 0:
b = b + i
else:
b = b - i
i = i + 1
return b

2.setup.py

1
2
3
4
5
6
7
8
from distutils.core import setup
from distutils.extension import Extension
from Pyrex.Distutils import build_ext

setup(
name='foo', ext_modules=[Extension("foo", ["foo.pyx"])],
cmdclass={'build_ext':build_ext}
)

三、编译成pyd

1.windows下编译

1
python setup.py build_ext --inplace -c mingw32

编译完成后会在当前目录下面生成foo.pyd和foo.c文件,还有一个build目录,只要把foo.pyd拿过来使用就可以了。

tip

在windows编译的时候要使用mingw32,我这里使用的是dev c++。我这里编译的时候找不到msvcr90,在windows目录下面搜索msvcr90.dll,把这个dll复制到C:Python26libs目录下,并改名为msvcr90.lib。

2.linux下编译

1
python setup.py build_ext --inplace

和windows的区别就是少一个-c mingw32参数。

四、测试速度

测试脚本test.py

1
2
3
4
5
from timeit import default_timer
from foo import run
t = default_timer()
print "result:%s"%run()
print "runtime:%s"%(default_timer() - t)

1.未使用pyrex

1
2
result:-5000000
runtime:1.96459442065

2.使用了pyrex

1
2
result:-5000000
runtime:0.0141805698895

像这种计算的速度提升还是很大的,推荐把部分复杂的算法用pyrex编译成pyd来提速。不过现在计算机硬件这么牛叉,语言的速度差别越来越不明显了。

文章目录
  1. 1. 一、首先安装pyrex
  2. 2. 二、然后编写代码
    1. 2.1. 1.foo.py
    2. 2.2. 2.setup.py
  3. 3. 三、编译成pyd
    1. 3.1. 1.windows下编译
    2. 3.2. 2.linux下编译
  4. 4. 四、测试速度
    1. 4.1. 测试脚本test.py
    2. 4.2. 1.未使用pyrex
    3. 4.3. 2.使用了pyrex