python怎么使用cython
1. Cython是什么?
它是一个用来快速生成Python扩展模块(extention module)的工具
语法是Python和c的混血
Cython作为一个Python的编译器,在科学计算方面很流行,用于提高Python的速度,通过OpenMPI库还可以进行吧并行计算。
2. Cython安装(Windows)
我的环境是win7 x64, python27, vs2010
安装的基础是有一个c编译器(这里以vs2010为例)
从下载安装包,解压到一目录,进入该目录,在cmd命令行中执行
python setup.py install
注:执行过程可能遇到问题:Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
解决方案:下载Microsoft Visual C++ Compiler for Python 2.7,点击直接安装即可。
3. 例子
例3.1:入门
创建hello.pyx,内容如下
def say_hello():
print "Hello World!"
创建setup.py,内容如下
from distutils.core import setup
from Cython.Build import cythonize
setup(name = 'Hello world app',
ext_modules = cythonize("hello.pyx"))
编译Cython代码
step1: 把.pyx文件被Cython便以为.c文件
step2: 把.c文件编译为可导入的使用模块.so(Windows下为.pyd)文件
python setup.py build
python setup.py install
注:可能出现问题:Unable to find vcvarsall.bat
原因:Python 2.7 会搜索 Visual Studio 2008.如果你电脑上没有这个版本的话就会报错。
如果装的是vs2010,那么在cmd命令行中执行
SET VS90COMNTOOLS=%VS100COMNTOOLS%
如果装的是vs2010,那么在cmd命令行中执行
SET VS90COMNTOOLS=%VS110COMNTOOLS%
>>> import hello
>>> hello.say_hello()
Hello World!
例3.2 通过静态类型提高速度
在Cython中可以通过标记静态类型来提高速度,凡是标记为静态类型的部分都会将动态语言类型变为简单的c代码,从而提速。
但是如果滥用静态类型,会降低可读性,甚至因类型设置不当导致错误类型检查造成速度降低。
例3.2.1 静态类型变量
Python原生态代码
compute.pyx
def f(x):
return x ** 2 - x
def integrate_f(a, b, N):
s = 0
dx = (b - a) / N
for i in range(N):
x += f(a + i * dx)
return s * dx
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Hello world app',
ext_modules = cythonize("compute.pyx"),
test.py
import compute
import time
starttime = time.clock()
compute.integrate_f(3.2, 6.9, 1000000)
endtime = time.clock()
print "read: %f s" %(endtime - starttime)
python setup.py build
python setup.py install
python test.py
read: 0.332332 s
使用静态变量替换后的代码
compute2.pyx
def f(double x):
return x ** 2 - x
def integrate_f(double a, double b, int N):
cdef int i
cdef double s, dx
s = 0
dx = (b - a) / N
for i in range(N):
s += f(a + i * dx)
return s * d
setup2.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Hello world app',
ext_modules = cythonize("compute2.pyx"),
test2.py
import compute2
import time
starttime = time.clock()
compute2.integrate_f(3.2, 6.9, 1000000)
endtime = time.clock()
print "read: %f s" %(endtime - starttime)
python setup.py build
python setup.py install
python test.py
read: 0.109200s
该测试用例,使用静态类型速度是不使用静态类型的3倍。
例3.2.2 静态类型函数
把compute2.pyx中的函数变为
cdef double f(double x):
return x ** 2 - x
def integrate_f(double a, double b, int N):
cdef int i
cdef double s, dx
s = 0
dx = (b - a) / N
for i in range(N):
s += f(a + i * dx)
return s * dx
read: 0.084859 s
结论:比例子3.2.1速度又快了
例3.3 调用C函数
cdef extern from "math.h":
double sin(double)
double cos(double)
cpdef double Sin(double x):
return sin(x)
cpdef double Cos(double x):
return cos(x)
cpdef: 对于Python可使用的函数使用(为了使得在以后的Python程序中调用Sin,Cos函数,用cpdef,而不用cdef)
cdef: 对于C可使用的函数使用
请注意,上面的代码声明了 math.h 里的函数,提供给 Cython 使用。C编译器在编译时将会看到 math.h 的声明,但 Cython 不会去分析 math.h 和单独的定义。cython是用c写的python实现
cython是不同的语言,相当于python再加上些c特性,比如说类型声明。1.找个工具将这个接口API,自动转换成python版本的就可以了。好象是SWIG和Boost。 这两个以前看过,偶尔还试过几次。
2.之所以建议你用自动工具,就是因为python对于C++扩展麻烦些,对于C语言接口可以使用ctypes和cython简单解决。
python中" "与' '的区别
python中“ ”与‘ ’在表示字符串时是没有区别的
在输出时,输出内容有“ ”(双引号)则在单引号内使用双引号,即‘“要输出内容”’;
输出内容有‘ ’(单引号)则在双引号内使用单引号,即“‘要输出内容‘“;
补充:''' (三引号)用法:
1、用作多行注释;2、用作表示一个字符串
注:python中并没有提供专门的多行注释的符号,当一串字符被三引号引用时,但它不作为字符串被操作时,这个三引号内引用的内容就被视为注释。
希望我的回答对你有所帮助,谢谢1. 普通字符串中没有区别:如'abc'和"abc"是一样的;
2. 如果字符串中本身就有单引号或双引号,则要使用另一种引号将该字符串引起来才合法:如'he is a "student" !' , “he is a 'student' !”
3.接着2说,如果字符串中本身就有单引号或双引号,还有一种合法的使用方式是,最外层使用的引号和字符串的相同,但是字符串本身的引号要使用反斜杠转义,如:
'he is a \'student\' !' , "he is a \"student\" !"
4.再就是三引号"""abc""" , '''abc'''可以跨越多行。
*.所以就我了解到的,光单引号和双引号的使用没啥大区别python是一种脚本语言,它的运行需要python解释器,属于解释型的语言,python本身就是由c语言开发出来的,而且是开源的,由此可见c语言的强大,美国宇航局使用的就是python; c语言属于中级语言,它介于高级和低级语言之间,c是编译型的语言,它的运行必须经过编译器的处理才能形成最终的执行代码,c语言的应该非常广泛,c语言最主要的用途就是系统底层的应用。