首页 > 编程语言 >加速Python代码的秘密武器,探索Cython的秘密

加速Python代码的秘密武器,探索Cython的秘密

时间:2024-02-25 19:23:12浏览次数:38  
标签:pyx Cython 文件 Python 代码 秘密武器 example

首先和大家明确一下这个Cython单词的读法,这个单词Cython以前我也不知道怎么读,老后面要用到这个包的时候,老是不清楚读法,才去搜了下,这个单词是读"赛森",就是前面的cy是读"赛",后面的读法和python后一个读音thon一样。

Cython是什么

Cython是一个用于将Python代码转换为C或C++代码的编译器。Cython能够将Python和C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库。它允许充分发挥c语言性能的优势,同时仍然可以利用Python的简洁和易用性。Cython是一个独立的项目,并不是Python的标准库,可以通过安装Cython包来使用它。

使用Cython可以将Python代码转换成C或C++,进而编译成机器码。这样一来,借助Cython,可以在不改变太多代码的情况下,大大提高Python程序的运行度。Cython还提供了一些特性,如声明静态类型、直接调用C函数等,一步提升性能。

要安装Cython包,可以使用Python的包管理器(如pip)在命令行中运行以下命令:

pip install Cython

安装完成后就可以在Python代码中使用Cython来编译优化。常见的用例包括编写高性能的数值计算库、C/C++的接口协议等。

当您使用Cython将Python代码转换为C或C++代码时,需要将Python代码中的一些部分注为Cython特定类型注释,以告诉Cython如何将其转换为相应的C或C++代码。

如何使用Cython

使用Cython有一定的规则,不可以随便使用,以下是一个简单的示例,演示如何使用Cython将Python代码转换C代码:

  1. 创建一个名为example.pyx的文件,包含以下代码:
def add_numbers(a, b):
    return a + b
  1. 然后你需要在相同目录下创建一个名为setup.py的文件,包含以下代码:
from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize("example.pyx"))
  1. 然后进入包含example.pyxsetup.py文件的目录,运行以下命令:
python setup.py build_ext

然后就会你当前目录下生成一个example.c的C文件。可以在文件中看到Cython将代码转换为的C。这个生成的里面代码比较多,也比较复杂,当然核心代码就是实现就是实现pyx文件中的功能。如果你有观察当前目录的话,你会发现有个build目录生成。build目录下面就有example相关的so文件生成。

我们验证一下是否是如此

Python 3.7.9 (default, Apr 26 2023, 09:00:47) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> example.add_numbers(100, 200)
300
>>> 

当然你也可以讲生成的c文件自己编译成so文件,通过以下编译命令就可以生成example.so的动态链接库

gcc -fPIC -c example.c -o example.o -I/usr/include/python3.7m/ -lpython3.7
gcc -shared -o example.so example.o

也就是说你用example的python代码写了一个接口,然后通过cython转成c代码编译成了so文件,也就相当于你既拥有了python语言的快速开发,又有了c语言的性能,这个就是cython的强大之处。

通过这种方式,可以将Python代码转换为C或C++代码,并通过编译器将其进一步编译成机器码。Cython提供了许多优化选和类型声明,可以进一步提高生成的C代码的性能。当然这只是一个非常非常简单示例,实际使用肯定比这个复杂的多,更多关于Cython的详细信息可以去Cython的官方社区了解。

pyx文件是啥

后缀为.pyx的文件是Cython的源代码文件,而不是Python的源代码文件。它将用于扩展Python的代码转换为C或C++代码,以提供更高的性能。.pyx文件包含了Cython编写的代码,其中可以包含Python代码和ython特定的语法。

Cython的源码文件使用.pyx作为文件后缀,以明确识这是Cython的文件,而不是普通的Python代码文件。反正就是pyx是兼容python的代码的,让你既拥有了python语言的快速开发,又有了c语言的性能。

标签:pyx,Cython,文件,Python,代码,秘密武器,example
From: https://www.cnblogs.com/kiwiblog/p/18032764

相关文章

  • 测试工程师常用的python库
    大家好,今天给各位小伙伴带来的是测试工程师常用的10个python库,相信有些小伙伴肯定知道一些库,也使用过一些库。下面我们就来聊聊这常用的10个python库,我们主要介绍这些库和这些库的一些应用场景,方便没有接触过的小伙伴知道这些库的作用。个人认为以下10个库是测试工程师最常用的库......
  • 常用的Python代码片段(绘图)
    Proplot绘制具有经纬网的地图importproplotasppltimportcartopyfig,ax=pplt.subplots(proj=['cyl'],ncols=1,nrows=1)ax.add_feature(cartopy.feature.COASTLINE)ax.add_feature(cartopy.feature.BORDERS,linestyle=':',linewidth=0.5)ax.add_featu......
  • Python 相关知识-1
    1.Python内存泄漏和内存溢出是两种不同的问题,但它们都与内存管理有关.内存泄漏是指在使用动态分配的内存时,由于某些原因导致某些已分配的内存块无法被释放,从而使得程序占用的内存不断增加,最终导致内存耗尽。在Python中,内存泄漏可能由多种原因引起,例如全局变量、闭包、循环......
  • Python中生成器和迭代器的概念及两者区别
    本文详细介绍Python中生成器和迭代器的概念及两者区别。并通过一个案例分析两者在实际应用中的性能差异。 生成器生成器是一种特殊类型的迭代器,它使用函数和yield关键字定义,可以像普通函数一样调用和执行。生成器在每次迭代时产生一个值,并在下一次迭代时恢复执行。 在......
  • 【Python】 回文数的四种解法
    回文数就是指整数倒过来和原整数相等。1234Example1:  Input:121Output:true12345Example2:  Input:-121Output:falseExplanation:Fromlefttoright,itreads-121.Fromrighttoleft,itbecomes121-.Therefore......
  • python——面向对象——知识汇总
    面向对象技术简介类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。......
  • Python函数每日一讲1 - 一文让你彻底掌握Python中的frozenset函数
    引言在Python中,frozenset()函数是一个重要的工具,用于创建不可变的集合对象。本文将介绍frozenset()函数的语法、用法示例以及实际应用场景,帮助大家更好地理解和应用这个函数。语句概览frozenset()函数的语法如下:frozenset(iterable)其中,iterable是一个可迭代对象,例如......
  • Python 字符串格式化输出
    数字n:int=1000000000print(f'{n:_}')#1_000_000_000print(f'{n:,}')#1,000,000,000对齐var:str='var'#右对齐,使用_填充print(f'{var:_>20}')#_________________var#左对齐,使用#填充print(f'{var:#<20}�......
  • python dict 哈希表
    哈希值Python 内置函数 hash 返回对象 哈希值 ,哈希表 依赖 哈希值 索引元素:根据哈希表性质, 键对象 必须满足以下两个条件,否则哈希表便不能正常工作:哈希值在对象整个生命周期内不能改变;可比较,且比较相等的对象哈希值必须相同;满足这两个条件的对象便是......
  • python GIL 全局锁
    GIL由来我们先思考一个问题:我们在前面介绍的 list 、 dict 等内建对象是 线程安全 的吗?在 Python 层面,list 、dict 等内建对象是线程安全的,这是最基本的常识。研究 list、dict 等内建对象源码时,我们并没有看到任何 互斥锁 的痕迹,这多少有点令人意外。以 li......