新手到Cython(也许这是一个基本问题).考虑这个博客中的两个例子:
# code 1
import numpy as np
def num_update(u):
u[1:-1,1:-1] = ((u[2:,1:-1]+u[:-2,1:-1])*dy2 +
(u[1:-1,2:] + u[1:-1,:-2])*dx2) / (2*(dx2+dy2))
Run Code Online (Sandbox Code Playgroud)
和
# code 2
cimport numpy as np
def cy_update(np.ndarray[double, ndim=2] u, double dx2, double dy2):
cdef unsigned int i, j
for i in xrange(1,u.shape[0]-1):
for j in xrange(1, u.shape[1]-1):
u[i,j] = ((u[i+1, j] + u[i-1, j]) * dy2 +
(u[i, j+1] + u[i, j-1]) * dx2) / (2*(dx2+dy2))
Run Code Online (Sandbox Code Playgroud)
假设我使用以下setup.py脚本编译第一个文件:
# setup file for code 1
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext = Extension("laplace", ["laplace.pyx"],)
setup(ext_modules=[ext], cmdclass = {'build_ext': build_ext})
Run Code Online (Sandbox Code Playgroud)
和第二个文件与以下setup.py脚本:
# setup file for code 2
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
ext = Extension("laplace", ["laplace.pyx"],
include_dirs = [numpy.get_include()])
setup(ext_modules=[ext], cmdclass = {'build_ext': build_ext})
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我使用常规numpy并且没有numpy在安装文件中导入,而在第二种情况下我导入numpy使用cimport,声明变量使用cdef但随后也包含numpy在安装文件中.
Cython 无论如何编译第一个代码(第一个代码似乎工作).
什么是使用的优点cimport,并cdef(通过设置文件)与不使用与用Cython编译前cimport和cdef(通过设置文件)与用Cython编译之前?
HYR*_*YRY 12
import numpy在Cython中与Python相同,但cimport numpy告诉Cython加载声明文件:
https://github.com/cython/cython/blob/master/Cython/Includes/numpy/ 初始化 .pxd
其中声明了所有C-API函数,常量和类型,还包括头文件,例如numpy/arrayobject.h.
如果使用声明变量np.ndarray[...],Cython将知道如何将数组元素访问转换为c代码,这比Python的[]运算符快得多.
你需要告诉c编译器numpy头文件在哪里setup.py,所以你打电话numpy.get_include()来获取路径.
| 归档时间: |
|
| 查看次数: |
8407 次 |
| 最近记录: |