Cython 笔记 (Python/Jython)

2023-09-21 15:17:14

1. Cython 笔记 (Python)

Cython: C-Extensions for Python

C vs. Cython vs. Mojo Comparison Chart

Cython is an optimising static compiler for both the Python programming language and the extended Cython programming language (based on Pyrex). It makes writing C extensions for Python as easy as Python itself.

Cython 是 Python 编程语言和扩展 Cython 编程语言(基于 Pyrex) 的优化静态编译器。它使得为 Python 编写 C 扩展和 Python 本身一样简单。

2. python 加速库 cython 简介

2.1. Cython 是什么?

Cython 是让 Python 脚本支持 C 语言扩展的编译器, Cython 能够将 Python+C 混合编码的。pyx 脚本转换为 C 代码, 主要用于优化 Python 脚本性能或 Python 调用 C 函数库。由于 Python 固有的性能差的问题, 用 C 扩展 Python 成为提高 Python 性能常用方法, Cython 算是较为常见的一种扩展方式。

2.2. 如何安装 Cython?

我们可以通过 conda 或者 pip 来进行安装, 命令如下:

$ conda install -c anaconda cython

或者

$ pip install Cython

2.3. 简单示例

安装完成后, 我们以一个简单的 Cython 项目作为例子, 来说明 Cython 的编译步骤.首先我们需要知道 Cython 源文件均以 .pyx 结尾.比如我们需要定义一个简单的返回一个字符串的函数, 如下所示:

  1. 创建 examples_cy.pyx
$ touch examples_cy.pyx
  1. 往里写入函数 hello_cython, 如下所示
def hello_cython():
    return "Hello Cython!"
  1. 在同级目录下创建 setup.py, 该文件负责编译上述 pyx 文件生成 .c.so 文件
$ touch setup.py

内容如下:

from distutils.core import setup
from Cython.Build import cythonize
setup(
    name="Example Cython",
    ext_modules=cythonize(["examples_cy.pyx"])
)
  1. 执行编译命令
python setup.py build_ext --inplace

执行上述命令, 进行编译, 编译前目录结构如下:

编译过程如下:

编译后如下:

  1. 编写 main.py, 进行验证
$ touch main.py

内容如下:

from examples_cy import hello_cython
print(hello_cython())

执行结果如下:

2.4. 性能比对

学会上面简单的操作后, 接下来我们来举一个稍微复杂的例子来对比使用 Python 和 Cython 的性能.我们以计算以下级数为例来做相关性能对比:

  1. 使用 python 代码实现如下:
def pi_py(N):
    pi = 0
    for n in range(N):
        pi += (-1.0)**n/(2*n + 1)
    return 4*pi
  1. 使用 cython 代码实现如下:

在上述 examples_cy.pyx 里, 使用 cython 语法实现上述操作, 代码如下:

cpdef double pi_cy(int N):
    cdef double pi = 0
    cdef int n;
    for n in range(N):
        pi += (-1.0) ** n / (2 * n + 1)
    return 4 * pi

上述代码中的 cpdef 表明在 C 语言层面声明了函数。正如我们所知道的在 C 语言中你必须为每一个函数定义返回值的类型.一般来说 def 定义的函数可以从 python 和 Cython 调用, 而 cdef 可以从 Cython 和C调用.

  1. 再次编译
python setup.py build_ext --inplace
  1. main.py 中编写统计耗时函数
from examples_cy import hello_cython,pi_cy
import time

def pi_py(N):
    pi = 0
    for n in range(N):
        pi += (-1) **n / (2*n + 1)
    return 4*pi

if __name__ == "__main__":
    print(hello_cython())
    
    stime = time.time()
    for _ in range(100):
        out1 = pi_py(1000000)
    etime = time.time()

    stime2 = time.time()
    for _ in range(100):
        out2 = pi_cy(1000000)
    etime2 = time.time()

    print("pi_py result {} time cost {} s".format(out1, etime - stime))
    print("pi_cy result {} time cost {} s".format(out2, etime2 - stime2))

我们统计上述两个函数执行 100 次的时间, 结果如下:

2.5. 总结

使用 Cython 和 Python 完成上述通过计算级数来实现 pi 值的逼近, 使用 Cython 相比 Python 效率可以提升 5 倍​以上。

3. PYTHON, CYTHON, JYTHON, IRONPYTHON 的区别 (注意: 此篇有误导,表述不一定正确,只提供一个方向)

python 源代码 ====> python 字节码 ======> 运行虚拟机

3.1. PYTHON, CYTHON

将这两个放在一起, 是因为 python 的标准和原始实现就是基于 cython 的, 由于 python 的源代码是需要将 python 源码首先编译为 c 代码, 然后再编译为本机代码的方式运行的, 由于 c 语言和本机代码的关系, 执行速度比较快。

3.2. JYTHON

首先将 python 编译为基于 java 字节码的字节码文件, 然后在 java 虚拟机 jvm 上运行 java 字节码

ython 是一种完整的语言, 而不是一个 Java 翻译器或仅仅是一个 Python 编译器, 它是一个 Python 语言在 Java 中的完全实现。Jython 也有很多从 CPython 中继承的模块库。最有趣的事情是 Jython 不像 CPython 或其他任何高级语言, 它提供了对其实现语言的一切存取。所以 Jython 不仅给你提供了 Python 的库, 同时也提供了所有的 Java 类。这使其有一个巨大的资源库。

3.3. IronPython

将 python 编译为基于 .NET 的 CLI 的中间语言文件, 然后在 CLR 上运行。

3.4. python 命名空间

对于 python 来说, 命名空间是变量的封装, 最直接的命名空间就是文件, 文件是该文件中的变量的封装, 每一个模块文件自动成为一个命名空间, 每个模块文件都是独立完备的命名空间, 文件必须明确地导入其他的文件, 才可以使用这些文件的变量名。

更多推荐

多台服务器sessionId共享

目录多台服务器sessionId共享解决方案:ASP.NETCore参考代码(NET7):登录处理登录(请求)过滤器过滤器使用BaseController多台服务器sessionId共享sessionid是服务器首次与浏览器创建连接时,生成的id值,存入浏览器端cookie中,值加密的,下次请求时,浏览器自动带上ses

Flutter——启动页白屏的优化

flutter启动页白屏的优化:使用图片替代白屏结构图核心的代码如上图,修改两个launch_background.xml里的代码为:<item><bitmapandroid:gravity="center"android:src="@mipmap/ic_launcher"/></item>@mipmap/ic_lau

探讨代理IP与Socks5代理在跨界电商中的网络安全应用

在数字化时代,跨界电商已经成为了商业世界中的一大趋势。然而,跨越国界的电商活动也伴随着网络安全挑战。本文将讨论如何利用代理IP和Socks5代理技术来提高跨界电商中的网络安全,同时也探讨了与游戏相关的爬虫应用。1.代理IP和Socks5代理的基本概念1.1代理IP代理IP是一种网络技术,允许用户在访问互联网时使用中间服

JWT令牌

一、JWT(JsonWebToken)能干什么1、安全认证(权限认证)比如登录系统的时候,服务器会检查前端请求数据中携带的token信息,符合标准则允许访问,不符合则拒绝你的访问请求。2、信息传递比如两个系统之间传递信息,a服务器向B服务器发送token信息,b服务器对token进行解签名,发现签名对的上就接收数据,对

进程程序替换

✅<1>主页::我的代码爱吃辣📃<2>知识讲解:Linux——进程替换☂️<3>开发环境:Centos7💬<4>前言:我们创建子进程的目的是什么?想让子进程帮我们执行特定的任务。那么如何让子进程去执行一段新的代码呢?一.背景二.子进程程序替换三.替换函数1.execv2.execlp3.execle4.命名理解四.

打工人的灵魂,五天在囚笼里,剩下两天在骂街

点击文末“阅读原文”即可参与节目互动剪辑、音频/卷圈运营/SandLiu卷圈监制/姝琦封面/姝琦@midjourney产品统筹/bobo场地支持/声湃轩天津录音间在不想上班这件事上,从古至今,从名人大师到渺小如我们,所有人的想法都是一样的。高尔基他老人家说过:工作是快乐时,人生便是幸福;工作是义务时,人生便是苦役。按照

FastAPI学习大纲

FastAPI是一个现代的、快速的(高性能的)、基于标准Python类型的Web框架,用于构建APIs。它基于标准的Python类型提示,并且它的主要优点是速度、类型安全以及自动的API文档生成。如果您要使用FastAPI,以下是一些必须了解的关键点及相关命令:安装:pipinstallfastapi[all]pipi

第三、四、五场面试

第三场共享屏幕做题(三道简单题)替换空格成%20(双指针)删除升序链表中的重复元素(指针)有效的括号(栈)第四场、第五场自我介绍项目拷打整个项目架构rpc模块的情况分析的数据从那里获取,如何获取整个项目还有哪些不足与改进docker模块的主要工作说一下DNSmap底层的红黑树跟二叉搜索树有什么区别?介绍一下HTTP介绍

DataSheet专业名词解读——每天10个专业名词(1)23.9.18 (NXP)MPC5604B/C

文章目录1.variablelengthencoding(VLE)可变长度编码2.ErrorCorrectionCode(ECC)纠错编码3.Memoryprotectionunit(MPU)内存保护单元4.Interruptcontroller(INTC)中断控制器5.Frequencymodulatedphase-

机器视觉-标定篇

3D结构光标定结构光视觉的优点:非接触、信息量大、测精度高、抗干扰能力强。结构光视觉传感器参数的标定包括:摄像机参数标定、结构光平面参数标定。结构光视觉测量原理图我们不考虑镜头的畸变,将相机的成像模型简化为小孔成像模型,则特征点的图像坐标Pf与其在摄像机坐标系下的三维坐标P之间的关系可表示为:其中:(u,v)是特征点的

在Vue中使用Immutable.js

在Vue3中使用Immutable.js以下是如何在Vue.js中使用Immutable.js的步骤:首先,需要安装immutable.js。你可以通过npm或yarn来安装:npminstallimmutable或者yarnaddimmutable在你的Vue组件中导入Immutable:import{Map,Lis

热文推荐