python---之cython的使用

4. 写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,来打印每个整数值。

5. 写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

6.写TestOMP.py

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

  

from TestOMP import Test   
Test()  

转载:https://www.cnblogs.com/nucdy/p/7736155.html

猜你喜欢

转载自blog.csdn.net/zxyhhjs2017/article/details/80582189