PyPy 为什么会比 CPython 还要快?
def add(x, y):return x + y
然后 CPython 执行起来大概是这样(伪代码):
if instance_has_method(x, '__add__') {return call(x, '__add__', y) // x.__add__ 里面又有一大堆针对不同类型的 y 的判断
} else if isinstance_has_method(super_class(x), '__add__' {return call(super_class, '__add__', y)
} else if isinstance(x, str) and isinstance(y, str) {return concat_str(x, y)
} else if isinstance(x, float) and isinstance(y, float) {return add_float(x, y)
} else if isinstance(x, int) and isinstance(y, int) {return add_int(x, y)
} else ...
这下能看出来因为 Python 的动态类型,一个简单的函数里面要有这么多判断才能正确执行。然后这还没完,你以为里面把两个整数相加的函数,就是 C 语言里面的 x + y 么?naive。
实际上 Python 里面一个 int 大概是个这样的结构体(也是伪代码,真实情况要比这个复杂):
struct {prev_gc_obj *objnext_gc_obj *objtype intvalue int... other fields
}
然后每个 int 都是这样的结构体,还是动态分配出来放在 heap 上的,里面的 value 还不能变,也就是说你算 1000 这个结构体加 2000 这个结构体,得出来 3000 这个结构体,还要去 heap 上 malloc 一个结构体来。
CPython 每次就这么老老实实的执行这个过程,就算你每次调用 add 函数都是只传两个整数。
然后 pypy 执行的时候,发现执行了一百遍 add 函数,发现你 TM 每次都只传两个整数进来,那我何苦每次还给你做这么多计算,于是当场生成了一个类似 C 的函数:
int add_int_int(int x, int y) {return x + y;
}
然后当场编译成机器码,然后你下次每次调用 add(1, 2) 的时候,直接就调用这个 “Native” 的函数,你说你 Pypy 快不快?
上面这个过程就叫做 Just In Time 编译,也就是 JIT,肯定比 CPython 的执行速度要快了。当然 JIT 也有很多问题,比如编译本身也很花时间,如果这段代码本来就只执行一次,需要1s,但是你把它编译出来需要10s,那 JIT 就得不偿失了。所以很多 JIT 实现都会先解释执行,然后确定了一段代码经常被执行之后,再进行编译。并且分多层 JIT,比较初级的对编译出来的机器码不做比较复杂的优化什么的。
Pypy 和 Unladen Swallow 对比的话,最大的不同点就是前者基本完工了(可用),后者做一半坑了。另外的区别的话,Unladen Swallow 立项的目的是完全兼容 CPython,于是直接再 CPython 的 codebase 上改,想要把之前 CPython 解释执行的部分改成 JIT 执行,然后内存模型不改,于是就能兼容 Cpython(包括原生扩展)。Pypy 的话基本都是自己重写的,(原生扩展)兼容性没有放在第一位了。
PyPy 为什么会比 CPython 还要快?相关推荐
- 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)
源:介绍一款比Android原生模拟器还要快的模拟器Genymotion
- 比CopyMemory还要快的函数SuperCopyMemory
程序代码: 'VB内嵌ASM加快内存数据复制 Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias ...
- 任正非解释华为鸿蒙系统,比Android/iOS还要快,看任正非怎么说华为鸿蒙系统
原标题:比Android/iOS还要快,看任正非怎么说华为鸿蒙系统 据外媒报道,华为创始人兼CEO任正非7月4日在接受法国<观点>杂志采访中,谈及华为自研鸿蒙系统. 任正非表示,鸿蒙系统将 ...
- 库克电话会实录:iphone se比最快的Android手机还要快
当地时间周四苹果公布2020年第二财季财报.财报显示,苹果公司当季营收583.1亿美元,相比去年同期的580.2亿美元小幅上涨1%,高于分析师此前预期的547.8亿美元:净利112.5亿美元,较去年同 ...
- PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快
PyTorch训练中Dataset多线程加载数据,而不是在DataLoader 背景与需求 现在做深度学习的越来越多人都有用PyTorch,他容易上手,而且API相对TF友好的不要太多.今天就给大家带 ...
- 【PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快】
文章目录 一.引言 二.背景与需求 三.方法的实现 四.代码与数据测试 五.测试结果 5.1.Max elapse 5.2.Multi Load Max elapse 5.3.Min elapse 5 ...
- 这位曾指责乔布斯的怪老头,推出的AppleScript比Windows还要快!
(知名自动化专家Sal Soghoian) 加入苹果仅仅六个月,Sal Soghoian的工作就已经上线了.1997年7月,当时的CEO吉尔·阿梅里奥刚被赶下台,苹果的股票开始暴跌.为了拯救公司,苹果 ...
- 比迅雷还要快的视频下载利器You-Get
现在在线视频超火爆,可是我还是更倾向于将视频下载至本地后观看,原因之一是受不了播放时的卡顿,还有一个原因就是保存文件以备以后观摩,比如说视频教程.其实,这样也是可以省流量的!(因为后续看的时候就不花流 ...
- 自制python搜索小工具,比电脑自带的还要快
目录 前言 环境准备 完整代码 前言 嗨嗨,大家晚上好 ~ 当自己电脑文件很多还有点乱,不记得自己文件放哪里的时候,用电脑自带的搜索文件,这个等待时间可慢了 对我们这种敲代码的,这能忍吗,所以我们不如 ...
最新文章
- 牛顿迭代法的可视化详解
- 参加51CTO学院软考培训,我通过啦
- spring IOC容器设计理念与核心注解的使用
- 运维之我的nginx短篇教程
- php执行只读文件,php实现以只读方式打开文件的方法
- autowired用在static_java – @Autowired和static方法
- 3D游戏建模到底需要学习哪些美术基础?新手学习3D建模?
- NLP工具包(Albert+BiLSTM+CRF)
- 江苏计算机二级vb,江苏省计算机等级考试二级vb.ppt
- python入门神器下载_Python编程神器 v3.7.2 最新免费版
- Maya---之viewcube的寻找
- 免费得到高程地图的方法
- python ttk style,如何改变ttk.progressBar颜色在python
- Python爬取链家租房信息
- 织梦系统参数设置出现Token mismatch!提示的解决办法
- 电网数字化转型经验分享
- STP生成树协议(超详细小白也能看懂)
- 你想象不到这些明星竟然是程序员出身
- C语言—整除问题、求余、赋值、逻辑运算符易错点
- C# 农历日期帮助类