pyx文件 生成pyd 文件用于 cython调用

faster-rcnn 需要2k个候选框,这很费时间的,所以可以把这部分代码优化,改写为pyx文件,然后就可以快一些了。

1安装cython

官网上下载的Cython-0.20.1,从控制台上切到cython的路径,运行setup.py就一路编译安装下去了,没遇到其他问题。

在网上看到,很多人在安装的时候遇到很多问题,基本上都是找不到c++编译器,具体表现是提示找不到一个叫“vs....bat”的文件。解决办法通常是安装mingw(gcc在windows下的版本),然后修改一个.cfg文件,指定用这个编译器来build。

windows安装使用这些偏底层的Python扩展太不爽了,怎么彻底解决 error: Unable to find vcvarsall.bat 呢?
    1.不要按网上说的,安装MinGW,然后在“..python安装路径...\Lib\distutils”下新建一个文件distutils.cfg,在这文件里面指定编译器为mingw32
       如:
[build]
compiler=mingw32

上面这种方式有问题,我也尝试了一下,是不报上面的那个。error: Unable to find vcvarsall.bat错误了 ,但是有开始报:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 6: invalid s
tart byte

查询一下其他博客人家是这样说的

百度一下mingw是什么,毕竟不是GCC,又不如VC接windows的地气,编译出来的东西,安装上了也有不好使的时候。
甚至我遇到MinGW还无法编译greenlet0.4.1,导致greenlet无法源码安装。
MinGW经常command 'gcc' failed with exit status 1 或者error: unrecognized command line option '-mno-cygwin'。
即使编译通过了,安装上了,你安装的Python标准库不是由mingw编译的,
你的扩展包却是mingw编译的,谁也不敢保证完全兼容或者说质量跟得上,
说不准一些莫名其妙的神经质错误。
我的安装过程没有遇到问题,看网上的解释,貌似是python2.7的cpython是用vistual studio 2008来编译的,默认找对了编译器,所以没问题了。总之,装上了,没问题。

看来还是按装VS2010:

摘抄于:http://blog.csdn.net/darren2015zdc/article/details/54574868    
 1.去下载安装VS2010(08版貌似也行,不过没必要用旧版,指不定哪个库又无法编译),给个地址(百度的云盘  国内应该速度可以)
http://pan.baidu.com/share/link?shareid=1609273194&uk=3255422755
   然后注意这一步很重要:命令行下执行 SET VS90COMNTOOLS=%VS100COMNTOOLS%
   如果你安装的是 2012 版 SET VS90COMNTOOLS=%VS110COMNTOOLS%
   如果你安装的是 2013版 SET VS90COMNTOOLS=%VS120COMNTOOLS%
   或者更暴力,直接配置系统环境变量 VS90COMNTOOLS指向 %VS你的版本COMNTOOLS%
   你还可以更暴力,在“..python安装路径...\Lib\distutils目录下有个msvc9compiler.py找到243行  
                  toolskey = "VS%0.f0COMNTOOLS" % version   直接改为 toolskey = "VS你的版本COMNTOOLS"(这个就是为什么要配 ”VS90COMNTOOLS“ 的原因,
                 因为人家文件名都告诉你了是  Microsoft vc 9的compiler,   代码都写死了要vc9的comntools,就要找这个玩意儿,找不到不干活)
   这么做的理由是Python2。7 扩展包是可以用08版或者更高的VS编译的,其setup.py(安装脚本)都是去windows系统寻找08版的VS,所以设置VS90的path
   如果Python版本小于2.7,强烈建议使用 VS08版,用2010或者更高可能部分扩展不好使。给个例子:
    http://stackoverflow.com/questions/6551724/how-do-i-point-easy-install-to-vcvarsall-bat    这个例子说明 VS2010不适合Python2.6

    2.安装VS后该重启的重启,clean一下之前安装Python扩展失败的残留文件,然后 直接下载 pil   pillow greenlet  eventlet等源码,解压后python setup.py build发现都可以编译了。
      接下来就换成 python setup.py install安装吧。

2. 写pyx文件

pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行。我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,“语法错误”。不理会他,本来cython的语法在python里面就不支持。创建TestOMP.pyx文件,并在文件中写代码如下:

 TestOMP.pyx

from cython.parallel import prange, parallel, threadid
from libc.stdio cimport printf
 
def Test():
    cdef int i = 0
    cdef int sum = 0
    for i in prange(1000000, num_threads=2, nogil=True):  
        printf ("%d\n", i)
第一句引入了cython中的并行处理模块,尤其是prange。我理解,prange就是“python 'range' of parallel version”,就是并行循环。第二句是引入了c语言中的‘printf’函数。整个文件就定义了一个Test函数。看到,每个变量在使用前都要声明类型。在prange中,有参数‘num_threads’来设定并发数量。nogil表示‘no gil(Global Interpreter Lock)’,想要获得并行,这个参数就要设置。在循环过程中,调用了c的库函数printf,来打印每个整数值。

3. 写setup.py文件

pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行。我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,“语法错误”。

上面的pyx文件还仅仅是源代码文件,要想被python调用、要想运行,仅仅写了源代码还是不够的。具体来说,还要转成.c或者.c++的文件,并且再进一步转成.pyd文件。pyd文件才是可以直接使用的文件。为了达到上述目的,就要写一个setup.py脚本,如下:

  setup.py

#!/usr/bin/python  
#python version: 2.7.3  
#Filename: SetupTestOMP.py  
   
# Run as:    
#    python setup.py build_ext --inplace    
     
import sys    
sys.path.insert(0, "..")    
     
from distutils.core import setup    
from distutils.extension import Extension    
from Cython.Build import cythonize    
from Cython.Distutils import build_ext  
     
# ext_module = cythonize("TestOMP.pyx")    
ext_module = Extension(  
                        "TestOMP",  
            ["TestOMP.pyx"],  
            extra_compile_args=["/openmp"],  
            extra_link_args=["/openmp"],  
            )  
     
setup(  
    cmdclass = {'build_ext': build_ext},  
        ext_modules = [ext_module],   
)  

这个完全是一个python脚本,可以在python解释器下面运行。在控制台下,运行如下命令‘python setup.py build_ext --inplace’,就生成了TestOMP.pyd文件。

当然,同时还有一些杂七杂八的文件,如‘build’目录下面的‘lib’文件。这都提示着,这是在windows vistual studio环境下。在linux+gcc环境下,就要生成.so文件了,而且“/openmp”的选项就要写成“-fopenmp”

当然,这里的可以回遇到这样的问题:

Traceback (most recent call last):
File "setup.py", line 13, in <module>
from Cython.Build import cythonize
ImportError: No module named 'Cython'

可以执行pip进行安装:pip install Cython

 

4.写TestOMP.py

文件上述两个步骤,相当于把某个python效率瓶颈模块(这之前需要用profile工具来定位)用效率更高的代码写成了python的c扩展形式,接下来,就是要在python代码中调用他们。TestOMP.py就是这个调用的脚本,如下:

from TestOMP import Test   
Test()  

这个就很容易了,import并且调用。在控制台下,输入“python TestOMP.py”,运行。

参考https://www.cnblogs.com/nucdy/p/7736155.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值