加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

python3使用cython入门,编译pyd文件,加速100倍!

(2019-03-07 19:18:59)
标签:

python

分类: python爬虫
一、安装cython 和 Visiual Studio 2015 和一些设置
1.安装 Visiual Studio 2015
https://www.cnblogs.com/jianmu/p/7497274.html?utm_source=debugrun&utm_medium=referral
2.安装 cython:
pip install Cython

二、编写测试代码

1.新建test.py文件,编写斐波那契数列测试代码
https://www.cnblogs.com/yafengabc/p/6130849.html

import time


def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n - 1) + fib(n - 2)


def get_time():
    t = time.time()
    fib(40)
    return time.time() - t

print(get_time())
运行,输出的结果为40秒左右
2.将test.py复制一个 重命名为 test.pyx (这两个文件没有关联,而因为最后生成的pyd文件导入优先级高于py文件,所以py文件不用移除),给变量加上静态类型声明。

import time

cdef int fib(int n):
    if n == 0:
        return 0
    if n == 1:
       return 1
    return fib(n - 1) + fib(n - 2)

def get_time():
    t = time.time()
    fib(40)
    return time.time() - t
3.开始编译
https://www.cnblogs.com/jianmu/p/7497274.html?utm_source=debugrun&utm_medium=referral
在同目录下新建setup.py (名称随意),内容如下:

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize("test.pyx"))
控制台进入该目录,执行 python setup.py build_ext (加上--inplace参数后生成的目录结构会稍稍不同,但是没有影响),最后生成了一大堆文件,其中的pyd文件是我们所需要的,其他的可以删除。
将pyd文件的名称更改为test.pyd,这时候 test.pyx 也已经完成了他的使命。注意,pyd的名称似乎必须与之前的pyx名称相同,否则会提示如下错误:
ImportError: dynamic module does not define module export function 


4.测试编译后的代码的执行效率
新建一个包 pack_test,在包内新建一个 test_result.py,同时把test.pyd 文件也拷贝到这个包里。
test_result.py的内容如下:

import pack_test.test
print(pack_test.test.get_time())
输出结果为0.42685914039611816, 速度提升了100倍左右!


三、一些其他的注意事项
https://www.jianshu.com/p/fc5025094912

1.pyx中用cdef定义的类型,除类以外对.py都不可见
2.。。。

四、cython代码优化工具

1.https://www.douban.com/group/topic/20950369/
2.http://www.cnblogs.com/xybaby/p/6510941.html
。。。

五、maya相关的一些资料

1.Python 2.7 cython cythonize py 编译成 pyd 谈谈那些坑          http://www.cnblogs.com/ibingshan/p/10334471.html
2.Maya mayapy.exe 安装 Cython,编译 pyd
https://www.cnblogs.com/ibingshan/p/10346354.html
。。。

六、可以用pyinstaller打包pyd文件

七、打包多个py文件为一个pyd文件
https://。。。/questions/19646985/making-one-pyd-for-a-set-of-files-with-cython
。。。=stackoverflow.com

packageA.pyx

include "mod1.pyx"
include "mod2.pyx"
include "mod3.pyx"

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [
        Extension("packageA", sources=["packageA.pyx"])
    ]
)   

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有