导航:首页 > 编程语言 > pythoncython教程

pythoncython教程

发布时间:2022-07-18 15:06:55

python怎么使用cython

1. Cython是什么?

它是一个用来快速生成Python扩展模块(extention mole)的工具

语法是Python和c的混血

Cython作为一个Python的编译器,在科学计算方面很流行,用于提高Python的速度,通过OpenMPI库还可以进行吧并行计算。

2. Cython安装(Windows)

我的环境是win7 x64, python27, vs2010

安装的基础是有一个c编译器(这里以vs2010为例)

从http://cython.org下载安装包,解压到一目录,进入该目录,在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_moles = cythonize("hello.pyx"))

编译Cython代码

step1: 把.pyx文件被Cython便以为.c文件
step2: 把.c文件编译为可导入的使用模块.so(Windows下为.pyd)文件

1
2

python setup.py build
python setup.py install

注:可能出现问题:Unable to find vcvarsall.bat

原因:Python 2.7 会搜索 Visual Studio 2008.如果你电脑上没有这个版本的话就会报错。

如果装的是vs2010,那么在cmd命令行中执行

1

SET VS90COMNTOOLS=%VS100COMNTOOLS%

如果装的是vs2010,那么在cmd命令行中执行

1

SET VS90COMNTOOLS=%VS110COMNTOOLS%

执行

1
2
3

>>> 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_moles = 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)

执行

1
2
3

python setup.py build
python setup.py install
python test.py

结果

1

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_moles = 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)

执行

1
2
3

python setup.py build
python setup.py install
python test.py

结果

1

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

结果

1

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 和单独的定义。

㈡ python中怎么读取文件内容

用open命令打开你要读取的文件,返回一个文件对象
然后在这个对象上执行read,readlines,readline等命令读取文件
或使用for循环自动按行读取文件

㈢ 如何系统地自学 Python

是否非常想学好 Python,一方面被琐事纠缠,一直没能动手,另一方面,担心学习成本太高,心里默默敲着退堂鼓?

幸运的是,Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。

Python 的设计哲学之一就是简单易学,体现在两个方面:

㈣ 如何使用用Cython通过Python列表到C函数

的#include<&stdio.h中GT;
#包括“test.h”
无效流行(无效){
一个[0] =将0x55;
一个[1] = 0x66;
一个[2] = 0x77;
A [3] ='\\ 0';
}
无效的putAll(INT N,焦炭C []){
的memcpy(A,C,N);
}
字符* GETALL(无效){
返回&放大器;一个[0];
}

㈤ cython与python的不同有哪些

Cython是Python的一个超集,结合了Python的易用性和原生代码的速度,可以编译成C语言,产生的性能提升可以从几个百分点到几个数量级,具体取决于手头的任务。

使用Cython,你可以避开Python的许多原生限制,或者完全超越Python,而无需放弃Python的简便性和便捷性。

Python代码可以直接调用C模块。这些C模块可以是通用的C库或专门为Python工作的库。Cython生成第二种类型的模块:与Python内部对话的C库,可以与现有的Python代码绑定在一起。

Cython代码在设计上看起来很像Python代码。如果你给Cython编译器提供了一个Python程序,它将会按原样接受它,但是Cython的原生加速器都不会起作用。但是如果你用Cython的特殊语法来修饰Python代码,那么Cython就可以用快速的C代替慢的Python对象。

请注意,Cython的方法是渐进的。这意味着开发人员可以从现有的Python应用程序开始,通过对代码立刻进行更改来加快速度,而不是从头开始重写整个应用程序。

这种方法通常与软件性能问题的性质相吻合。在大多数程序中,绝大多数CPU密集型代码都集中在一些热点上,也就是帕累托原则的一个版本,也被称为“80/20”规则。因此,Python应用程序中的大部分代码不需要进行性能优化,只需要几个关键部分。你可以逐渐将这些热点转换为Cython,从而获得你最需要的性能提升。程序的其余部分可以保留在Python中,以方便开发人员。

相关推荐:《Python入门教程》

Cython优势

除了能够加速已经编写的代码之外,Cython还具有其他几个优点:

使用外部C库可以更快

像NumPy这样的Python软件包可以在Python界面中打包C库,使它们易于使用。但是,这些包在Python和C之间来回切换会减慢速度。Cython可以让你直接与底层库进行通信,而不需要Python(也支持C ++库)。

可以同时使用C和Python内存管理

如果你使用Python对象,它们就像在普通的Python中一样被内存管理和垃圾收集。但是如果你想创建和管理自己的C级结构,并使用malloc/free来处理它们,你可以这样做,只记得自己清理一下。

可以根据需要选择安全性或速度

Cython通过decorator 和编译器指令(例如@boundscheck(False))自动执行对C中弹出的常见问题的运行时检查,例如对数组的超出边界访问。因此,由Cython生成的C代码默认比手动C代码安全得多。

如果确信在运行时不需要这些检查,则可以在整个模块上或仅在选择功能上禁用它们以获得额外的编译速度。

Cython还允许本地访问使用“缓冲协议”的Python结构,以直接访问存储在内存中的数据(无需中间复制)。Cython的“记忆视图”可以高速地在这些结构上进行工作,并且具有适合任务的安全级别。

Cython C代码可以从释放GIL中受益

Python的全局解释器锁(Global Interpreter Lock,GIL)同步解释器中的线程,保护对Python对象的访问并管理资源的争用。但GIL被广泛批评为Python性能的绊脚石,特别是在多核系统上。

如果有一段代码不会引用Python对象并执行长时间运行,那么可以使用nogil:指令将其标记为允许它在没有GIL的情况下运行。这使得Python中间人可以做其他事情,并允许Cython代码使用多个内核(附加工作)。

Cython可以使用Python类型的提示语法

Python有一个类型提示语法,主要由linters和代码检查器使用,而不是CPython解释器。 Cython有它自己的代码装饰的自定义语法,但是最近修改了Cython,你可以使用Python类型提示语法为Cython提供类型提示。

Cython限制

请记住,Cython不是一个魔术棒。它不会自动将每一个poky Python代码变成极速的C代码。为了充分利用Cython,你必须明智地使用它,并理解它的局限性:

常规Python代码的加速很少

当Cython遇到Python代码时,它不能完全翻译成C语言,它将这些代码转换成一系列对Python内部的C调用。这相当于将Python的解释器从执行循环中提取出来,这使得代码默认加速了15%到20%。请注意,这是最好的情况。在某些情况下,可能看不到性能改善,甚至性能下降。

原生Python数据结构有一点加速

Python提供了大量的数据结构 - 字符串,列表,元组,字典等等。它们对于开发者来说非常方便,而且他们自带了自动内存管理功能,但是他们比纯C慢。

Cython让你继续使用所有的Python数据结构,尽管没有太多的加速。这又是因为Cython只是在Python运行时调用创建和操作这些对象的C API。因此,Python数据结构的行为与Cython优化的Python代码大致相同:有时会得到一个提升,但只有一点。

Cython代码运行速度最快时,“纯C”

如果你在C中有一个标有cdef关键字的函数,那么它的所有变量和内联函数调用都是纯C的,所以它的运行速度可以和C一样快。 但是,如果该函数引用任何Python原生代码(如Python数据结构或对内部Python API的调用),则该调用将成为性能瓶颈。

幸运的是,Cython提供了一种方法来发现这些瓶颈:一个源代码报告,一目了然地显示您的Cython应用程序的哪些部分是纯C以及哪些部分与Python交互。 对应用程序进行了更好的优化,就会减少与Python的交互。

为Cython应用程序生成的源代码报告。 白色区域纯C;黄色区域显示与Python内部的交互。一个精心优化的Cython程序将尽可能的黄色。 展开的最后一行显示了解释其相应Cython代码的C代码。

Cython NumPy

Cython改进了基于C的第三方数字运算库(如NumPy)的使用。由于Cython代码编译为C,它可以直接与这些库进行交互,并将Python的瓶颈带出循环。

但是NumPy特别适用于Cython。 Cython对NumPy中的特定结构具有本地支持,并提供对NumPy数组的快速访问。在传统的Python脚本中使用的熟悉的NumPy语法可以在Cython中使用。

但是,如果要创建Cython和NumPy之间最接近的绑定,则需要使用Cython的自定义语法进一步修饰代码。例如,cimport语句允许Cython代码在编译时在库中查看C级构造,以实现最快的绑定。

由于NumPy被广泛使用,Cython支持NumPy“开箱即用”。如果你安装了NumPy,你可以在你的代码中声明cimport numpy,然后添加进一步的装饰来使用暴露的函数。

Cython分析和性能

可以通过分析代码并亲眼目睹瓶颈在哪里获得最佳性能。Cython为Python的cProfile模块提供钩子,因此可以使用Python自己的分析工具来查看Cython代码的执行情况。无需在工具组之间切换;可以继续所熟悉和喜爱的Python世界中工作。

它有助于记住所有情况下,Cython不是魔术,仍然适用明智的现实世界的表现实践。在Python和Cython之间来回穿梭越少,你的应用运行得越快。

例如,如果你有一个你想要在Cython中处理的对象的集合,那么不要在Python中迭代它,并且在每一步调用一个Cython函数。将整个集合传递给你的Cython模块并在那里迭代。这种技术经常在管理数据的库中使用,因此这是在自己的代码中模拟的好模型。

我们使用Python是因为它为程序员提供了便利,并且能够快速开发。有时程序员的工作效率是以牺牲性能为代价的。使用Cython,只需要一点点额外的努力就可以给你两全其美的好处。

㈥ cython 需要 c 基础吗

还可以使用Cython来实现混编
1 Cython,用Python setup.py install进行安装
2 一个实例

① 创建helloworld目录创建helloworld.pyx,内容如下:cdef extern from"stdio.h": extern int printf(const char *format, ) def SayHello(): printf("hello,world\n")
② 编译,最方便的是利用python的Distutils了,
helloworld目录下创建Setup.py,内容如下:from distutils.core import setupfrom distutils.extension import Extensionfrom Cython.Build import cythonize setup( name = 'helloworld', ext_moles=cythonize([ Extension("helloworld", ["helloworld.pyx"]), ]),) 编译:python Setup.py build安装:python Setup.py install安装后,会将在build/lib.???目录下生成的helloworld.pyd拷贝到Lib/site-packages注: 有时我们只是希望测试一下,并不希望安装,这时可以把build/lib.???目录下的helloworld.pyd拷贝到当前目录 或者在importhelloworld前执行脚本:import sys;sys.path.append(pathof helloworld.pyd) ③ 测试:>>>import helloworld >>>helloworld.SayHello() hello,world

㈦ 如何使用cython编译扩展

先是安装Cython。由于我只有Windows,所以就只介绍这个平台。
英文的说明可以看《InstallingOnWindows》,共有2步:
一、安装MinGW。现在SF已不提供完整安装版了,只能下载在线安装版。由于Cython也支持C++,所以我也勾选了g++编译器。
装好后把MinGW目录/bin加入PATH环境变量,并保证gcc --version可以正确执行。
接着去Python目录\Lib\distutils下添加一个distutils.cfg文件,内容如下:
[build]
compiler = mingw32
实际上这最后一步也可不做,但每次编译都需要加一个-c参数来指定编译器。
二、安装Cython。
我是直接下载exe版本的,直接运行即可。Python 2.4可能还要做些额外处理,我没有这个版本,没法测试。

接着就可以来测试了,先来写个hello world。
hw.py:
def hi():
print "Hello World"
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_moles = [Extension("hw", ["hw.py"])]
)
然后运行这段代码进行编译:
setup.py build_ext --inplace
这就生成了很多文件,其中hw.pyd就是生成的C扩展了。
接着测试一下:
>>> from hw import hi
>>> hi()
Hello World
然后来测试下性能:
csigma.py和pysigma.py:
def sigma(n):
a = 0
for i in xrange(n):
a += i
return a
测试脚本:
from timeit import Timer

print Timer('sigma(10000)','from csigma import sigma').timeit(10000)
print Timer('sigma(10000)','from pysigma import sigma').timeit(10000)

㈧ Python 开发中有哪些高级技巧

bobby《Python3高级核心技术97讲》(超清视频)网络网盘

链接: https://pan..com/s/1iJ9VvVE3Km_x4-RCfI5Anw

提取码: ti4i 复制这段内容后打开网络网盘手机App,操作更方便哦

若资源有问题欢迎追问~

㈨ python是什么语言编写出来的

python是什么语言编写出来的?
python是C语言编写出来的,并且Python提供了丰富的API和工具,所以程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。
Python简介:
Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。
Python是一种解释型脚本语言,可以应用于以下领域:
Web 和 Internet开发
科学计算和统计
人工智能
教育
桌面界面开发
软件开发
后端开发
相关推荐:《Python教程》以上就是小编分享的关于python是什么语言编写出来的的详细内容希望对大家有所帮助,更多有关python教程请关注环球青藤其它相关文章!

阅读全文

与pythoncython教程相关的资料

热点内容
国产系统怎么解压 浏览:540
战双程序员 浏览:483
him触摸编程软件 浏览:931
植物大战僵尸存档怎么转移安卓 浏览:852
java栈的元素 浏览:737
程序员与篮球事件 浏览:675
app反编译不完整 浏览:788
电脑上的文件夹怎么调整 浏览:7
服务器无响应是什么原因呀 浏览:984
wd文档里的app怎么制作 浏览:513
电脑里的文件夹没有了一般能恢复吗 浏览:418
哪里有配加密钥匙的 浏览:210
服务器开不了机怎么把数据弄出来 浏览:958
gif动态图片怎么压缩 浏览:521
黑猴子棒球压缩文件解压密码 浏览:631
如何让app适应不同的手机屏幕大小 浏览:10
苹果手机如何给安卓手机分享软件 浏览:761
苹果电脑怎么运行腾讯云服务器 浏览:59
明日之后沙石堡命令助手 浏览:261
蛋糕店用什么样的app 浏览:877