Cython 笔记 (Python/Jython)
目录
- 1. Cython 笔记 (Python)
- 2. python 加速库 cython 简介
- 2.1. Cython 是什么?
- 2.2. 如何安装 Cython?
- 2.3. 简单示例
- 2.4. 性能比对
- 2.5. 总结
- 3. PYTHON, CYTHON, JYTHON, IRONPYTHON 的区别 (注意: 此篇有误导,表述不一定正确,只提供一个方向)
- 3.1. PYTHON, CYTHON
- 3.2. JYTHON
- 3.3. IronPython
- 3.4. python 命名空间
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
结尾.比如我们需要定义一个简单的返回一个字符串的函数, 如下所示:
- 创建 examples_cy.pyx
$ touch examples_cy.pyx
- 往里写入函数
hello_cython
, 如下所示
def hello_cython():return "Hello Cython!"
- 在同级目录下创建
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"])
)
- 执行编译命令
python setup.py build_ext --inplace
执行上述命令, 进行编译, 编译前目录结构如下:
编译过程如下:
编译后如下:
- 编写
main.py
, 进行验证
$ touch main.py
内容如下:
from examples_cy import hello_cython
print(hello_cython())
执行结果如下:
2.4. 性能比对
学会上面简单的操作后, 接下来我们来举一个稍微复杂的例子来对比使用 Python 和 Cython 的性能.我们以计算以下级数为例来做相关性能对比:
- 使用 python 代码实现如下:
def pi_py(N):pi = 0for n in range(N):pi += (-1.0)**n/(2*n + 1)return 4*pi
- 使用 cython 代码实现如下:
在上述 examples_cy.pyx
里, 使用 cython 语法实现上述操作, 代码如下:
cpdef double pi_cy(int N):cdef double pi = 0cdef 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调用.
- 再次编译
python setup.py build_ext --inplace
- 在
main.py
中编写统计耗时函数
from examples_cy import hello_cython,pi_cy
import timedef pi_py(N):pi = 0for n in range(N):pi += (-1) **n / (2*n + 1)return 4*piif __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 来说, 命名空间是变量的封装, 最直接的命名空间就是文件, 文件是该文件中的变量的封装, 每一个模块文件自动成为一个命名空间, 每个模块文件都是独立完备的命名空间, 文件必须明确地导入其他的文件, 才可以使用这些文件的变量名。
相关文章:
Cython 笔记 (Python/Jython)
目录 1. Cython 笔记 (Python)2. python 加速库 cython 简介2.1. Cython 是什么?2.2. 如何安装 Cython?2.3. 简单示例2.4. 性能比对2.5. 总结 3. PYTHON, CYTHON, JYTHON, IRONPYTHON 的区别 (注意: 此篇有误导,表述不一定正确,只提供一个方向)3.1. PY…...

[React] react-hooks如何使用
react-hooks思想和初衷,也是把组件,颗粒化,单元化,形成独立的渲染环境,减少渲染次数,优化性能。 文章目录 1.为什么要使用hooks2.如何使用hooks2.1 useState2.2 useEffect2.3 useLayoutEffect2.4 useRef2.5…...

多个pdf合并成一个文件,3个方法合并pdf
如何把多个pdf合并成一个文件?在我们日常的工作中,经常会遇到一些需要处理的文件,其中包括PDF文件。特别是当我们需要将多个PDF文件合并成一个PDF文件时,会面临一些困难。这样的情况下,我们的阅读能力会受到限制&#…...
代码随想录 动态规划Ⅸ
198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…...

【数据结构】散列表(哈希表)的学习知识总结
目录 1、散列表 2、散列函数 2.1 定义 2.2 散列函数的构造 2.2.1 除留余数法 2.2.2 直接定址法 2.2.3 数字分析法 2.2.4 平方取中法 3、冲突(碰撞) 4、处理冲突的方法 4.1 拉链法(链接法) 4.2 开放定址法 5、C语言…...

2023智慧云打印小程序源码多店铺开源版 +前端
智慧自助云打印系统/智慧云打印小程序源码 前端 这是一款全新的基于Thinkphp的最新自助打印系统,最新UI界面设计的云打印小程序源码...

利用亚马逊 云服务器 EC2 和S3免费套餐搭建私人网盘
网盘是一种在线存储服务,提供文件存储,访问,备份,贡献等功能,是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制,比如限制下载速度࿰…...
数据分析技能点-数据的种类
在日常生活中,数据无处不在。当你去超市购物时,你可能会注意到商品的价格、重量、口味等;当你在社交媒体上浏览时,你可能会注意到好友的点赞数、评论等。这些都是数据的一种形式,而了解这些数据的种类和特点有助于我们更好地理解和使用它们。 数据的基本分类 数据大致可…...

解读:ISO 14644-21:2023《洁净室及相关受控环境:悬浮粒子采样》发布指导粒子采样!
药品洁净实验室环境监测结果是否满足微生物检测需求,直接决定检测结果的有效性准确性,进行药品微生物检测,必须对实验环境进行日常和定期监测,其内容包括非生物活性的空气悬浮粒子数及有生物活性的微生物监测。 悬浮粒子监测是保证…...

Java --- MySQL8之索引优化与查询优化
目录 一、索引失效场景 1.1、全值匹配 1.2、最佳左前缀规则 1.3、主键插入顺序 1.4、计算、函数、类型转换(自动或手动)导致索引失效 1.5、类型转换导致索引失效 1.6、范围条件右边的列索引失效 1.7、不等于(! 或者<>)索引失效 1.8、is null可以使用索引&…...

澳大利亚新版《2023年消费品(36个月以下儿童玩具) 安全标准》发布 旨在降低危险小零件的伤害
2023年9月4日,澳大利亚政府发布了新的儿童玩具强制性安全标准《2023年消费品(36个月以下儿童玩具)安全标准》(Consumer Goods (Toys for Children up to and including 36 Months of Age) Safety Standard 2023)。该强制性标准旨在尽可能地降…...

表格内日期比较计算
需求:在表格中新增数据,计算开始日期中最早的和结束日期中最晚的,回显到下方。 <el-formref"formRef":model"ruleForm":rules"rules"style"margin-top: 20px;"label-position"top">…...
Linux内核启动流程-第二阶段start_kernel 函数
一. Linux内核启动 上一篇文章简单介绍了 Linux内核启动的第一阶段,即执行汇编流程。 本文简单了解一下,Linux内核启动的第二阶段:start_kernel函数,这是一个 C 函数。 本文续上一篇文章的学习,地址如下:…...
Disruptor:无锁队列设计的背后原理
简介 在高并发场景下,队列的速度和效率是关键。而Disruptor,一种高性能的并发队列,通过独特的设计,解决了传统队列在处理高并发时可能遇到的性能瓶颈。本文将深入分析Disruptor如何通过环形数组结构、元素位置定位以及无锁设计&a…...

网络编程-UDP协议(发送数据和接收数据)
需要了解TCP协议的,可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 TCP/IP参考模型 通过此图,可以了解UDP所在哪一层级中 代码案例 发送数据 package com.hidata.devops.paas.udp;import java.io.IOException; …...
AI绘画普及课【一】绘画入门
文章目录 一、AI 绘画入门1、Stable Diffusion VS. MidJourney2、Stable Diffusion 介绍3、Stable Diffusion 环境搭建4、文生图与图生图 一、AI 绘画入门 1、Stable Diffusion VS. MidJourney Midjourney 优点: 操作简单、出图绚丽多彩 缺点: 订阅付费充钱 内容有限制&a…...

Selenium和Requests搭配使用
Selenium和Requests搭配使用 前要1. CDP2. 通过requests控制浏览器2. 1 代码一2. 2 代码2 3. 通过selenium获取cookie, requests携带cookie请求 前要 之前有提过, 用selenium控制本地浏览器, 提高拟人化,但是效率比较低,今天说一种selenium和requests搭配使用的方法 注意: 一定…...

【JDK 8-函数式编程】4.4 Supplier
一、Supplier 接口 二、实战 Stage 1: 创建 Student 类 Stage 2: 创建方法 Stage 3: 调用方法 Stage 4: 执行结果 一、Supplier 接口 供给型 接口: 无入参,有返回值(T : 出参类型) 调用方法: T get(); 用途: 如 无参的工厂方法&#x…...

后端大厂面试-16道面试题
1 java集合类有哪些? List是有序的Collection,使用此接口能够精确的控制每个元素的插入位置,用户能根据索引访问List中元素。常用的实现List的类有LinkedList,ArrayList,Vector,Stack。 ArrayList是容量…...

产品经理认证(UCPM)备考心得
UCPM是联合国训练所CIFAL中心颁发的产品经理证书。如今,ESG是推动企业可持续发展的新潮流。UCPM作为一种可持续发展证书,为我们带来了一套先进科学、系统全面的产品管理模式,是产品管理领域公认的权威证书。那么,如何准备这张证书…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...