深入剖析PyPy,解锁Python比C还快的秘诀

Python - GIL(全局解释器锁)底层原理 GIL 是 CPython 解释器内部的一把全局互斥锁,保证同一时刻只有一个线程能执行 Python 字节码。需要注意它是 CPython 这个具体实现的细节,不是 Python 语言规范本身的要求——其他实现如 PyPy、Jython 对 GIL 的处理方式完全不同,Jython 甚至没有 GIL。GIL 锁住的具体是"字节码的执行过程",并不是锁住整个解释器的一切活动,比如线程在执行 I/O 相关的系统调用时会主动释放这把锁。 阅读详情
关注我的另一个号并加星标(专注python指标与策略),不定期送书抽奖:

来源丨网络

7bee1cc574d7bd6805ef15eabc3deeae.png

「如果想让代码运行得更快,您应该使用 PyPy。」 - Python 之父 Guido van Rossum

对于研究人员来说,迅速把想法代码化并查看其是否行得通至关重要。Python 是能够实现这一目标的出色语言,它能够让人们专注于想法本身,而不必过度为代码格式等无聊的事情困扰。

但是,Python 有一个致命的缺点:速度比 C、C ++ 等语言慢很多。那么,构建一个 Python 原型测试想法之后,如何将其转变为快速且高性能的工具?通常来说,人们还要再进行一步工作:将 Python 代码手动转换为 C 语言的代码。但如果 Python 原型本身就可以运行得很快,那么转换代码的时间就可以做一些更有意义的事情。

而 PyPy,恰好可以解决这一问题。它能够让 Python 代码运行得比 C 还快。

import time
from termcolor import colored

start = time.time()
number = 0
for i in range(100000000):
    number += i

print(colored("FINISHED", "green"))
print(f"Ellapsed time: {time.time() - start} s")

为了证明 PyPy 的速度,使用默认的 Python 解释器和 PyPy 运行上述代码,执行一个从整数 0 加到 100,000,000 的循环, 然后打印出运行时间。运行结果如下:

c22b95c4c04f39e711c7363b5b5de212.gif

运行时间 Python vs PyPy

这不是学术意义上的评估,但该结果是令人惊叹的。与大约需要 10 秒钟的默认 Python 解释器相比,PyPy 仅用 0.22 秒就完成了执行。而且无需进行任何更改就可以直接将 Python 代码放到 PyPy 上。而同一台计算机上,等效的 C 语言实现需要 0.32 秒,PyPy 甚至击败了最快的 C 语言。

为什么 PyPy 这么快?

尽管代码完全相同,但代码的执行方式却大不相同。PyPy 提升速度的秘诀是「即时编译( just-in-time compilation)」,即 JIT 编译。

提前编译 

C、C ++、Swift、Haskell、Rust 等编程语言通常是提前编译(AOT 编译)的。这意味着用这些语言编写代码之后,编译器会将源代码转换成特定计算机架构可读的机器码。也就是说在执行程序时,执行的并不是原始源代码,而是机器码。

77969efec90cef35ce7ccc03cbdd6fe7.png

提前编译把源代码转化为机器代码

解释语言 

与 C 语言等上述语言不同,Python、JavaScript、PHP 等语言采用另一种方法——解释语言。与将源代码转换为机器码相比,解释的过程中源代码是保持不变的。每次运行程序时,解释器都会逐行查看代码并运行。例如,每个 Web 浏览器都内置了 JavaScript 解释器。

ad5ed11893b25d27e622bab93f061a79.png

解释器逐行运行程序

即时编译

PyPy 是利用即时编译来执行 Python 代码的。即 PyPy 不同于解释器,它并不会逐行运行代码,而是在执行程序前先将部分代码编译成机器码。

5d88331eec7496de20c83eb86e25e3f9.png

JIT 编译综合了提前编译和解释

如上图所示,而 PyPy 使用的 JIT 编译是解释和提前编译的结合,可以利用提前编译来提高性能,并提高解释型语言的灵活性和跨平台可用性。

原文链接:https://towardsdatascience.com/run-your-python-code-as-fast-as-c-4ae49935a826

137acef638da8b741552c3ec8662e0d6.jpeg

最后推荐一下我们团队写的量化小册的内容,35篇内容!从Python安装,入门,数据分析,爬虫解释,爬取股票基金的历史+实时数据,如何写一个简单量化策略,策略回测,如何看资金曲线统统都有介绍!非常超值!

欢迎订阅:原价199 早鸟价39(满100人涨10元)。现在的价格非常非常低,只要2杯奶茶,就可以终身订阅+全套课程源码,还有永久陪伴群。48小时无理由退款,放心食用!

5e934911eee8c64fcd7357b2286ce92e.png

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径

干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影

趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!

AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

【信息科学与工程学】计算机科学与自动化——第二十四篇 编译器04 LLVM编译器02 B-WUCL(用户权重均匀对比损失)和D-WUCL(物品权重均匀对比损失)中,动态调整参数λ_new(新用户补偿因子)和α(长尾补偿强度)是优化推荐系统适应数据分布变化的核心。 阅读详情

相关推荐

【Milvus】实战指南:利用milvus-backup实现高效数据备份与恢复

本文详细介绍了如何利用官方工具milvus-backup为Milvus向量数据库实施高效的数据备份与恢复。文章从备份的必要性出发,逐步讲解了环境准备、配置要点、全量与按需备份操作,以及恢复数据的关键步骤和验证方法,旨在帮助用户构建可靠的数据安全防线,应对误操作或系统故障风险。

weixin_29217235的博客 131

深度揭秘:Python 凭啥适合敏捷开发,C 和 C++ 又如何称霸底层?

踏入编程语言的奇妙世界,Python、C 和 C++ 宛如三颗璀璨却个性迥异的星辰,散发着独特光芒。你是否好奇,为何在数据科学的浪潮中,Python 成为众多开发者的得力助手,而在操作系统内核这类对性能极致苛求的领域,C 和 C++ 又独占鳌头?今天,就让我们深入剖析这三种语言,解锁它们的神秘面纱。

2501_90200491的博客 1201

深入解析车载以太网DoIP诊断:Wireshark实战TCP/UDS报文分析

本文深入解析车载以太网DoIP诊断,重点介绍如何利用Wireshark进行TCP/UDS报文实战分析。文章详细讲解了从以太网帧、IP帧、TCP段到DoIP协议及UDS服务的逐层拆解方法,并提供了使用Wireshark定位通信故障(如乱序、丢包、重传)的实用技巧,帮助工程师高效排查车载诊断网络问题。

c2d3e4f的博客 674

Python性能测量基石:timeit模块原理与工程实践

在Python性能优化中,'快'必须建立在可复现、抗干扰的科学测量基础上。timeit模块并非简单计时工具,而是基于perf_counter高精度计时、隔离执行环境、剥离循环开销的微型基准测试框架。它通过repeat多轮采样与number批量执行,将单次混沌耗时转化为具有统计意义的时间分布,从而支撑算法对比、库选型、CI性能门禁等关键工程决策。相比time.time()等简易方法,timeit能真实反映CPU缓存稳定态下的执行效率,并天然适配字节码级性能分析,是Python开发者验证直觉、规避幻觉速度的必备

486

手把手教你用Proteus仿真51单片机抢答器:倒计时+蜂鸣器报警完整项目

本文详细介绍了使用Proteus软件仿真51单片机智能抢答器的完整项目流程。通过系统架构设计、核心元件选型(如74LS30用于按键中断编码),结合状态机编程,实现了带可调倒计时、数码管显示和蜂鸣器报警的八路抢答器功能。项目涵盖了从原理图绘制到代码调试的全过程,是学习嵌入式系统开发的绝佳实践。

tcp8optimizer的博客 262

SpringAI系列 - MCP篇(二) - MCP Server Boot Starter

此处需注意之前的。

罗小爬的技术宝书 1320

【Python智能体极速优化】:解锁10倍性能提升的隐藏技巧

掌握Python智能体性能优化技巧,轻松实现10倍运行效率提升。适用于AI代理、自动化任务与高并发场景,涵盖异步编程、内存管理与算法优化等核心方法,显著降低延迟与资源消耗。实战导向,效果稳定可靠,值得收藏。

CodeVibe的博客 561

Python基础语法与最佳实践【python基础篇】

本文全面介绍了Python基础语法与最佳实践,涵盖变量与数据类型、控制流、函数、模块与包等核心概念。通过实际代码示例展示了条件语句、循环结构、函数定义及模块导入的基本用法。在最佳实践部分,重点讲解了PEP 8代码风格规范、异常处理技巧、列表推导式、上下文管理器、文档字符串编写以及enumerate和zip的高效使用。这些内容既适合Python初学者掌握基础语法,也能帮助有经验的开发者编写更规范、高效、可维护的代码。文章强调遵循Python官方推荐实践,通过合理运用语言特性提升代码质量。

博客 1977

Python编程解锁高效数据分析与智能自动化新维度

机器学习管道的自动化构建方面,PyTorch Lightning的高阶API将模型部署效率提升4倍,其自动混合精度训练功能在V100 GPU上实现76%的显存节约。在工业质检领域,结合OpenCV的并行处理流水线与AutoKeras超参优化器,某电子制造企业将缺陷检测系统的迭代周期从14天缩短至6小时。在制造领域,结合强化学习的设备维护系统预见性维修准确率达到91%,使百万级产能工厂的维护成本降低43%。开发者正站在重构生产流程与决策机制的新起点,通过深度融合多学科技术栈,重新定义数据价值释放的边界。

mPTidIxZ的博客 345

QT C++ AI棉花智能变量灌溉工上位机(信创完整版)

北斗履带灌溉机器人/田间分区电磁阀基站 → 多层土壤温湿度/盐分EC传感器实时采集墒情 → 双目AI视觉扫描棉田长势、病苗分布 → AI融合**生育期+土壤墒情+盐分+棉株长势**计算变量灌溉定额、水肥配比、灌溉时长 → 分区电磁阀/变频水泵变量供水,病弱苗地块减量、干旱地块增量;墒情、盐分、长势多因子闭环修正灌水量;多层土壤含水率(0–10/20–40/40–80cm)、土壤EC盐分、土壤温度、空气温湿度、蒸发量、北斗地块坐标、管道水压、水肥罐液位、分区流量计、水泵电机负载、滴灌带压力反馈。

寒寒豆豆软件公司的博客 186

【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698

技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。WordPress和WordPress plugin都是WordPress基金会的产品。WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的参数转义不充分以及对现有 SQL 查询缺乏充分的准备,很容易通过“type”参数受到 SQL 注入攻击。

失心少年 1382

深入理解Python的GIL锁:从原理到实战,多线程到底是神兵还是枷锁?

任务类型单线程多线程多进程推荐方案CPU密集型(计算为主)基准基本不变或变慢部分加速多进程多进程I/O密集型(网络/磁盘)慢大幅加速中等加速多进程混合型基准部分加速可加速视比例而定核心原则:多线程适用于I/O密集型任务(在等待中让出GIL),多进程适用于CPU密集型任务(绕过GIL实现真正并行)。

m0_51069462的博客 457

广州吉欧电子科技有限公司安卓开发工程师岗位 - 技术核心、职责详解与面试指南

广州吉欧电子科技有限公司招聘安卓开发工程师,该岗位可接收优秀应届生。岗位职责包括:1)负责安卓应用架构设计与开发,确保稳定性和可扩展性;2)功能模块编码实现与测试;3)性能优化与用户体验提升;4)后端接口对接;5)系统版本适配;6)用户反馈处理迭代;7)特殊要求熟悉RTK高精度定位技术原理及使用。该岗位要求扎实的安卓开发技术、良好的架构设计能力、性能优化经验,以及特定领域的RTK专业知识,是一个技术全面且具有专业特色的开发岗位。

郑伟强dev的专栏 154

Python GIL 底层实现与高并发突破实战

本章聚焦 Python 高并发性能瓶颈,帮助开发者彻底理解 GIL 本质、底层实现与解锁方案。通过本章学习,你将全面掌握 Python GIL 底层原理、线程调度机制、高并发突破方案、生产实战优化 这一核心主题。

qq_28372005的博客 420

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[Python3高阶编程] - 多线程并发编程三:多线程无法真正使用多核的罪魁祸首GIL

GIL 是 CPython 解释器中的一个互斥锁(mutex),确保同一时刻只有一个线程执行 Python 字节码。它不是 Python 语言本身的特性,而是CPython 实现的细节。其他 Python 实现如Jython(基于 JVM)、IronPython(基于 .NET)就没有 GIL。PyPy 有 GIL,但其 JIT 优化在某些场景下能部分缓解影响。全屏复制关键点说明GIL 是什么CPython 中保护解释器状态的全局锁为何存在简化内存管理、提升单线程性能、历史原因主要影响。

1568

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 411

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 235

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 427

详解Python条件语句

在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。

2601_96798737的博客 208
上一篇: 如何用Python制作漂亮的进度条!
下一篇: 刚刚,2024 中国大学排名发布!
菜鸟学Python
博客等级 码龄9年 8062粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值