首页 > 编程语言 >【Python】通过Cython提升性能

【Python】通过Cython提升性能

时间:2024-07-18 16:28:14浏览次数:12  
标签:Cython arr sub 文件 Python 性能 setup

一、什么是Cython,

如果你了解Python,就会知道Python相比于其他语言,性能差了不是一点半点。但是Python的底层实现大量使用了C语言,可以与C语言很好的结合。并且在Python中由于GIL全局解释器锁的机制,导致python在实现CPU密集型操作时非常吃力。Cython是Python的一个扩展,用于将Python代码编译为C代码,并且可以完美的避开GIL机制,,从而显著提升性能。

二、调用.C文件

1、安装cython

pip install cython

2、编写.h头文件和.c文件

int sub(int n);//sub.h

编写C语言文件sub.c

#include "sub.h"

int sub(int n) {
    return n*(n+1)/2;
}

3、编写sub.pyx文件

cdef extern from "sub.h":
    int sub(int n)

def sub_with_c(n):
    return sub(n) 

4、编写setup.py文件

from distutils.core import setup,Extension
from Cython.Build import cythonize

ext = Extension(name="wrapper_sub",sources=["sub.pyx","c/sub.c"],language_level=3,)  
setup(ext_modules=cythonize(ext)) 

5、运行setup.py文件

python setup.py build

会生成一个sub.c文件和build目录以及wrapper_sub.cpython-39-darwin.so文件就是我们需要的共享模块。其余的可以删除。

6、调用共享模块

import wrapper_sub

if __name__ == '__main__':
    print(wrapper_sub.sub_with_c(100))

通过调用C编译后的文件可以极大的提高运行速度,并且可以避免GIL全局解释器锁的影响。

三、将Python代码编译为C共享模块

1、编写ArrarySort.pyx文件

这里实际上就是编写Python代码,将py后缀改为pyx

def arr_list(arr:list):
    arr.sort()
    return arr

2、编写setup.py脚本

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize("ArrarySort.pyx",language=3))

3、运行setup脚本

python setup.py build_ext --inplace

生成ArrarySort.cpython-39-darwin.so文件,其余文件可以删除。

4、调用共享模块

import ArrarySort

a= ArrarySort.arr_list([12,2134,2345,12,2])
print(a)

四、手动编写Cython

Cython本身有一套自己的写法规则,类似Python和C语言。可以直接编写pyx文件,将pyx编译为C代码,gcc编译器编译为共享模块(这一步可以不需要手动操作,distutils 自动处理)。

手动操作的话指令

gcc -shared -fPIC -I/python3.9 -o bubble_sort.so bubble_sort.c

1、编写pyx文件

这里使用Cython自身的语法规则,不需要使用C或Python进行其他的操作

def bubble_sort(arr):
    cdef int n = len(arr)
    cdef int i, j
    cdef int temp
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp

2、编写setup.py脚本

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("arrary_sort.pyx")
)

3、运行setup.py脚本

python setup.py build_ext --inplace

会在当前目录中生成一个与 bubble_sort 相对应的 C 文件,并编译生成一个共享对象文件(在 Linux 上是 .so 文件,在 Windows 上是 .pyd 文件)。这时候我们只需要共享文件即可。

4、在Python中调用共享模块

import arrary_sort

arr = [1,3,2,4,3,5,6,2,6,7,3]
arrary_sort.bubble_sort(arr)
print(arr)

五、总结

Cython是一种工具,可以让Python程序跑得更快。它通过将Python代码转换成C语言代码并进行编译,大大提升了程序的执行效率。使用Cython,你可以在Python代码中直接书写C语言的类型声明,这样不仅减少了解释器的开销,还能更高效地执行计算密集型任务。此外,Cython还能直接调用C语言的函数和数据类型,使得Python程序可以利用C语言的高性能。这种方法特别适合需要处理大量计算任务的场景,比如科学计算、数据分析和机器学习。同时,Cython保留了Python的简洁易用,开发者可以逐步优化代码,不需要一次性重写整个项目。这样,既能享受Python的开发便利,又能获得接近C语言的执行效率。

标签:Cython,arr,sub,文件,Python,性能,setup
From: https://blog.csdn.net/m0_73848096/article/details/140526191

相关文章

  • 【Python】使用PySide6 + Qt Designer创建简易用户界面(含用户交互)
    【Python】使用PySide6+QtDesigner创建简易用户界面(含用户交互)文章目录【Python】使用PySide6+QtDesigner创建简易用户界面(含用户交互)相关代码运行环境操作过程1.PySide6和QtDesigner的安装2.创建外部工具PyUIC和QtDesigner3.QtDesigner的简单使用说明4.完整代......
  • 一个python代码
     一个python代码importosimportnumpyasnpimportrefrompathlibimportPathoutput_folder='./data'filename_lineEdge=r'./data/fx0022/dom1lines_Edge.txt'filename_jgw=r'./data/fx0022/test/dom1.jgw'#读取线段文件data=[]i=......
  • 使用Java实现高性能的消息队列系统在淘客返利系统中的应用
    使用Java实现高性能的消息队列系统在淘客返利系统中的应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!消息队列系统是一种重要的组件,用于实现系统之间的异步通信和解耦。在淘客返利系统中,通过使用高性能的Java消息队列系统,可以提高系统的稳定性......
  • Java开发手册中-要求日志输出时字符串变量之间的拼接使用占位符与使用字符串拼接性能
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751参考以上性能测试工具的使用。Java开发手册中有这样一条:【强制】在日志输出时,字符串变量之间的拼接使用占位符的方式......
  • 基于SpringBoot的宠物领养系统-07863(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对宠物领养系统......
  • ubuntu 20 pyenv安装python环境
    安装pyenvgitclonehttps://github.com/pyenv/pyenv.git~/.pyenv或者自动安装程序curlhttps://pyenv.run|bash依赖库sudoapt-getupdatesudoapt-getupgradesudoapt-getinstallgccmakezlib1g-devdist-upgradesudoapt-getinstalllibbz2-devbuild-essenti......
  • python中的 == 和 is
    在Python中,==和is都是用于比较两个值的运算符,但它们的用途和含义不同。理解它们之间的区别对于编写正确的代码非常重要。==运算符==运算符用于比较两个对象的值是否相等。它检查对象的内容是否相同,而不关心它们是否是同一个对象。a=[1,2,3]b=[1,2,3]print(a......
  • 跨平台文件传输工具盘点,ToDesk性能最优
    当代打工人少不了经常需要在手机电脑上互传文件,作为工作文件备份或是方便随时查看。那么互传文件有什么简单高效的工具吗?今天小编来盘点几款跨平台文件传输工具,可以手机电脑互通传输,工作生活上都能用到!需要的话不妨收藏+转发,下次再想找就很方便啦!微信:聊天软件也能传文件微信......
  • python 内置类型简述(4) —— 集合映射类(set、frozenset、dict)
    注:Iterable[int]为任一元素为int类型的可迭代对象,如列表[1,2,3]注:set()为一个集合实例,可用任一列表替换(如{‘asd’}),frozenset()、dict()同理注:set|frozenset|dict表示参数可为set、frozenset、dict任一类型,set()|frozenset()|dict()同理1.新建字典{k......
  • 常用的性能优化方法
    性能优化是程序员工作必备的技能,下面分享一些经典的性能优化思路和方法。首先明确性能优化的定义和目标。性能优化是指通过持续的分析、实践和测试,确保系统稳定高效运行,从而满足用户的诉求。性能优化闭环:性能优化分类一般情况下,我们把性能优化分为2大类:1)通用优化是指一些......