当前位置: 首页 > news >正文

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 结尾.比如我们需要定义一个简单的返回一个字符串的函数, 如下所示:

  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 = 0for 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 = 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调用.

  1. 再次编译
python setup.py build_ext --inplace
  1. 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免费套餐搭建私人网盘

网盘是一种在线存储服务,提供文件存储,访问,备份,贡献等功能,是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制,比如限制下载速度&#xff0…...

数据分析技能点-数据的种类

在日常生活中,数据无处不在。当你去超市购物时,你可能会注意到商品的价格、重量、口味等;当你在社交媒体上浏览时,你可能会注意到好友的点赞数、评论等。这些都是数据的一种形式,而了解这些数据的种类和特点有助于我们更好地理解和使用它们。 数据的基本分类 数据大致可…...

解读: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日&#xff0c;澳大利亚政府发布了新的儿童玩具强制性安全标准《2023年消费品(36个月以下儿童玩具)安全标准》&#xff08;Consumer Goods (Toys for Children up to and including 36 Months of Age) Safety Standard 2023&#xff09;。该强制性标准旨在尽可能地降…...

表格内日期比较计算

需求&#xff1a;在表格中新增数据&#xff0c;计算开始日期中最早的和结束日期中最晚的&#xff0c;回显到下方。 <el-formref"formRef":model"ruleForm":rules"rules"style"margin-top: 20px;"label-position"top">…...

Linux内核启动流程-第二阶段start_kernel 函数

一. Linux内核启动 上一篇文章简单介绍了 Linux内核启动的第一阶段&#xff0c;即执行汇编流程。 本文简单了解一下&#xff0c;Linux内核启动的第二阶段&#xff1a;start_kernel函数&#xff0c;这是一个 C 函数。 本文续上一篇文章的学习&#xff0c;地址如下&#xff1a;…...

Disruptor:无锁队列设计的背后原理

简介 在高并发场景下&#xff0c;队列的速度和效率是关键。而Disruptor&#xff0c;一种高性能的并发队列&#xff0c;通过独特的设计&#xff0c;解决了传统队列在处理高并发时可能遇到的性能瓶颈。本文将深入分析Disruptor如何通过环形数组结构、元素位置定位以及无锁设计&a…...

网络编程-UDP协议(发送数据和接收数据)

需要了解TCP协议的&#xff0c;可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 TCP/IP参考模型 通过此图&#xff0c;可以了解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 接口 供给型 接口: 无入参&#xff0c;有返回值&#xff08;T : 出参类型&#xff09; 调用方法: T get(); 用途: 如 无参的工厂方法&#x…...

后端大厂面试-16道面试题

1 java集合类有哪些&#xff1f; List是有序的Collection&#xff0c;使用此接口能够精确的控制每个元素的插入位置&#xff0c;用户能根据索引访问List中元素。常用的实现List的类有LinkedList&#xff0c;ArrayList&#xff0c;Vector&#xff0c;Stack。 ArrayList是容量…...

产品经理认证(UCPM)备考心得

UCPM是联合国训练所CIFAL中心颁发的产品经理证书。如今&#xff0c;ESG是推动企业可持续发展的新潮流。UCPM作为一种可持续发展证书&#xff0c;为我们带来了一套先进科学、系统全面的产品管理模式&#xff0c;是产品管理领域公认的权威证书。那么&#xff0c;如何准备这张证书…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...