使用Cython对Python进行提速优化

news2024/12/25 8:53:15

因为常常使用Python,经常能感觉到和C,Java来说Python的速度太慢了。其中很大程度上是因为Python的类型是动态的,在解释类型方面花了较长时间。在调研过程中,发现给Python提速一个比较可行的方案是用Cython改写。

Cython的原理,短板,和Cpython的比较,这篇知乎写的非常详细
Python是不是被严重高估了? - 铁甲万能狗的回答 - 知乎
https://www.zhihu.com/question/266096929/answer/2383570933

首先是Cython的安装,pip install Cython
然后还需要下载Visual Stdio编译C的软件工具,我在Windows上的下载链接如下
https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/
需要勾选两个工具,SDK和MSVC,缺少的话会提示找不到io.h文件

C:\ProgramData\Anaconda3\include\pyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Tools\\MSVC\\14.37.32822\\bin\\HostX86\\x64\\cl.exe' failed with exit code 2

在这里插入图片描述
Cython官方文档:
http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html#the-basics-of-cython
中文版文档:
https://www.kancloud.cn/apachecn/cython-doc-zh/1944774

一些注意事项:
https://www.codenong.com/dc7854776e4cf62deb76/

现有一段测试性能的Python运行代码如下:

def integrate_f(a, b, N):
    s = 0
    dx = (b-a) /N
    for i in range(N):
        s += 2.71828182846**(-(a+i*dx)**2)
    return s*dx

def test_func():
    return integrate_f(1, 10, 100000000)

Java版本

package org.example;

import java.lang.Math;

public class Test {
    public static double integrate_f(double a, double b, int N) {
        double s = 0;
        double dx = (b-a)/N;
        for(int i =0; i <N; i++) {
            s += Math.pow(2.71828182846, -Math.pow(a+i*dx, 2));
        }
        return s*dx;
    }
    public static void main(String args[]) {
        long stime = System.nanoTime();
        double result = integrate_f(1,10, 100000000);
        long etime = System.nanoTime();
        System.out.println(result);
        System.out.printf("执行时长:%d 纳秒.", etime - stime );
    }
}

则它的Cython改写版本为:
(test_cython.pyx)

cimport cython

@cython.boundscheck(False)
@cython.wraparound(False)

cdef integrate_f(double a, double b, int N):
    cdef double s = 0
    cdef int i
    cdef double dx = (b-a) /N
    for i in range(N):
        s += 2.71828182846**(-(a+i*dx)**2)
    return s*dx

def test_func():
    return integrate_f(1, 10, 100000000)

可以看到比较典型的是多了两个注解,还有就是变量前通过cdef申明了类型
这样的Cython代码是不能直接在Pycharm里运行的,会提示invalid syntax。
需要进行编译后才能作为C扩展模块才能加入Python运行,这部分可以参考之前提到的官方文档,需要写一个类似于打包的setup程序。这里暂时使用的是一个简单的版本,name就是打包编译后的模块名,ext_modules就是需要进行编译的文件
(setup.pyx)

from setuptools import setup
from Cython.Build import cythonize

setup(
    name='test_cython',
    ext_modules=cythonize("test_cython.pyx"),
)

之后再通过命令行在当前目录生成编译的C文件,之后会发现多了.c文件和.pyd文件

python setup.pyx build_ext --inplace

再编写一个测试代码进行速度测试

import test_cython
import time
start_time=time.time()
result=check.test_func()
print(result)
print("用时:",time.time()-start_time)

测试的结果如下,
Python(3.9)用时24-26秒,Cython稳定在7.2秒,Java则是在7-10秒左右波动

附:boundscheck和wraparound两个注解的作用
https://zhuanlan.zhihu.com/p/657040768
Python 的列表和数组通常会在访问元素时执行边界检查,以确保不会访问超出范围的元素。这会导致额外的性能开销。在 Cython 中,你可以使用数组的 “boundscheck” 属性和 “wraparound” 属性来控制边界检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零售数据分析师熬夜整理:人、货、场、供、财这样做

在零售数据分析中&#xff0c;人、货、场、供、财数据分析非常重要&#xff0c;它们分别是指人员、商品、场所、供应和财务&#xff0c;对这些要素进行数据分析&#xff0c;可以更好地了解市场需求、优化商品供应链、调整销售策略和提高盈利能力。零售数据量大、分析指标多且复…

蓝桥·算法双周赛

文章目录 三带一数树数分组健身契合匹配奇怪的线段 一、三带一 本题思路:本题看了数据范围可以直接暴力解决。 #include <bits/stdc.h>int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T;std::cin>>T;while(T-…

C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析

Reddit 是一个非常受欢迎的分享社交新闻聚合网站&#xff0c;用户可以在上面发布和内容。我们的目标是抓取 Reddit 首页的数据 JSON&#xff0c;以便进一步分析和使用。 C#技术概述&#xff1a;C#是一种流行的编程语言&#xff0c;它具有流畅流畅的特点&#xff0c;非常适合开发…

用手势识别来测试视力?试试用百度AI来实现想法

文章目录 ⭐ 前言⭐ 灵感来源⭐ 项目准备⭐ 项目实现⭐ 不足与展望 ⭐ 前言 10月17日&#xff0c;以“生成未来&#xff08;PROMPT THE WORLD&#xff09;”为主题的百度世界2023将在北京首钢园举办。百度创始人、董事长兼首席执行官李彦宏将带来以“手把手教你做AI原生应用”…

【微信小程序开发】基础语法篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.视图层 1.数据绑定 wxml js 2 .列…

android CountDownTimer倒计时随时随地开启或关闭

前言 业务上有个需求&#xff0c;在心跳被触发时需要记录一个时间 当心跳断开后120s需要断开连接 如果收到心跳包就重置这个定时器的时间 代码实现 private CountDownTimer mTimer; private boolean mIsTimerRunning false;if (!mIsTimerRunning) {// 启动定时器startTimer…

消息队列学习分享

消息队列学习 消息队列来解决问题 &#xff08;1&#xff09;异步处理 消息通知、日志管理、更新统计数据等步骤 &#xff08;2&#xff09;流量控制 如何避免过多的请求压垮我们的系统&#xff1f; 比如一个秒杀系统&#xff0c;网关在收到请求后&#xff0c;将请求放入…

基于Pytest+Requests+Allure实现接口自动化测试

一、整体结构 框架组成&#xff1a;pytestrequestsallure设计模式&#xff1a; 关键字驱动项目结构&#xff1a; 工具层&#xff1a;api_keyword/参数层&#xff1a;params/用例层&#xff1a;case/数据驱动&#xff1a;data_driver/数据层&#xff1a;data/逻辑层&#xff1a…

数字化时代,数据仓库究竟是干什么的?

无论你是否专门从事大数据开发&#xff0c;作为一个开发人员&#xff0c;应该都听说过数据仓库的概念&#xff0c;那你知道为什么会出现数据仓库&#xff1f;数据仓库究竟是干嘛的吗&#xff1f;有什么价值和意义呢&#xff1f;那么本文就带到入门&#xff0c;揭开数据仓库的面…

嵌入式软硬分工与职业发展

嵌入式软硬分工与职业发展&#xff1a; 嵌入式系统分为软件和硬件两个方向。大公司通常明确员工从事嵌入式软件或硬件工作&#xff0c;分工合理利用经验解决问题。小公司可能综合工作&#xff0c;但长期不利深入学习和发展&#xff0c;对个人竞争力不利。嵌入式软件一般指底层…

财报解读:百事业绩继续超预期,无糖布局将带来新爆发?

7月份以来&#xff0c;美国市场通胀“二次反弹”&#xff0c;叠加新型减肥药在北美市场持续风靡&#xff0c;外界普遍预期食品饮料品类的消费将受到冲击。 然而&#xff0c;在此环境下&#xff0c;行业巨头百事仍然交出了一份全面超预期的三季报&#xff0c;并且还有力回应了新…

node 通过axios发送post请求(FormData)

方案一&#xff1a; const axios require(axios) const FormData require(form-data) const fs require(fs)const sdUpscaleOnAzure async (req, res) > {const data new FormData()data.append(image, fs.readFileSync(/temp/ai/sd/download/1.png))let config {hea…

动态规划:10 0-1背包理论基础II(滚动数组)

动态规划&#xff1a;10 0-1背包理论基础II&#xff08;滚动数组&#xff09; 接下来还是用如下这个例子来进行讲解 背包最大重量为4。 物品为&#xff1a; 重量价值物品0115物品1320物品2430 问背包能背的物品最大价值是多少&#xff1f; 一维dp数组&#xff08;滚动数组…

redis作为消息队列的缺点

Redis作为消息队列的不足。 1、基于内存 Redis是一种基于内存的数据库产品&#xff0c;这意味着数据存储在内存中&#xff0c;当内存不足时&#xff0c;Redis会使用基于磁盘的虚拟内存来存储数据。虽然这种虚拟内存机制可以增加Redis的存储容量&#xff0c;但也会降低Redis的…

19.项目开发之量化交易QuantTrade(一)

项目开发之量化交易QuantTrade 数据库创建&项目创建 SpringBoot项目之量化交易QuantTrade创建 创建项目之初&#xff0c;将需要的pom一次性导入 <properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.…

福建建筑模板厂家-能强优品木业

福建建筑模板厂家-能强优品木业&#xff0c;是一家专业从事建筑模板生产销售25年的源头工厂。我们以优质的产品和卓越的服务赢得了福建当地建筑施工企业的信赖与合作。作为一家有着丰富经验的建筑模板厂家&#xff0c;我们致力于提供高品质的产品&#xff0c;以满足客户的需求。…

一文2000字手把手教你写一份优质的性能测试报告的编写

性能测试项目实战&#xff08;风暴平台&#xff09; 1、背景 公司之前的测试团队做API的⾃动化测试都是使⽤JMeter等工具来进行&#xff0c;这样的话测试效率⽽⾔不是那么很⾼&#xff0c;⽽ 且在扩展性⽅⾯不是很有竞争⼒的。所以开发了新的测试平台&#xff0c;但是考虑到公…

只要看完这6个案例,就会刷新你对室内空间颜色搭配的认知

只要看完这6个案例&#xff0c;就会刷新你对室内空间颜色搭配的认知&#xff01; 室内设计和家居装饰灵感因 "芭比娃娃 "电影的上映而席卷了 A&D 行业。随着多年来粉红色的复苏&#xff0c;专家们采用大胆的粉红色调和女性化的装饰也就不足为奇了&#xff0c;而这…

不同阶段uncertainty如何设置

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; PreCTS stage: Setup uncertainty jitter skew margin Hold uncertainty skew margin PostCTS stage: Setup uncertainty jitter margin Hold uncertainty margin jitter指的是pll时钟抖动…

每个开发人员都想使用的编程语言

在任何时候&#xff0c;一些编程语言都会把大量的开发人员变成热情的布道者&#xff0c;试图说服世界其他地方的人相信它的伟大。 当热起来的时候&#xff0c;这种语言可能会成为行业标准&#xff0c;但其他时候&#xff0c;这种受欢迎程度就会消失。 在这个故事中&#xff0…