你本来有个 python 代码:

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 还要快?相关推荐

  1. 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)

    源:介绍一款比Android原生模拟器还要快的模拟器Genymotion

  2. 比CopyMemory还要快的函数SuperCopyMemory

    程序代码: 'VB内嵌ASM加快内存数据复制 Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias ...

  3. 任正非解释华为鸿蒙系统,比Android/iOS还要快,看任正非怎么说华为鸿蒙系统

    原标题:比Android/iOS还要快,看任正非怎么说华为鸿蒙系统 据外媒报道,华为创始人兼CEO任正非7月4日在接受法国<观点>杂志采访中,谈及华为自研鸿蒙系统. 任正非表示,鸿蒙系统将 ...

  4. 库克电话会实录:iphone se比最快的Android手机还要快

    当地时间周四苹果公布2020年第二财季财报.财报显示,苹果公司当季营收583.1亿美元,相比去年同期的580.2亿美元小幅上涨1%,高于分析师此前预期的547.8亿美元:净利112.5亿美元,较去年同 ...

  5. PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快

    PyTorch训练中Dataset多线程加载数据,而不是在DataLoader 背景与需求 现在做深度学习的越来越多人都有用PyTorch,他容易上手,而且API相对TF友好的不要太多.今天就给大家带 ...

  6. 【PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快】

    文章目录 一.引言 二.背景与需求 三.方法的实现 四.代码与数据测试 五.测试结果 5.1.Max elapse 5.2.Multi Load Max elapse 5.3.Min elapse 5 ...

  7. 这位曾指责乔布斯的怪老头,推出的AppleScript比Windows还要快!

    (知名自动化专家Sal Soghoian) 加入苹果仅仅六个月,Sal Soghoian的工作就已经上线了.1997年7月,当时的CEO吉尔·阿梅里奥刚被赶下台,苹果的股票开始暴跌.为了拯救公司,苹果 ...

  8. 比迅雷还要快的视频下载利器You-Get

    现在在线视频超火爆,可是我还是更倾向于将视频下载至本地后观看,原因之一是受不了播放时的卡顿,还有一个原因就是保存文件以备以后观摩,比如说视频教程.其实,这样也是可以省流量的!(因为后续看的时候就不花流 ...

  9. 自制python搜索小工具,比电脑自带的还要快

    目录 前言 环境准备 完整代码 前言 嗨嗨,大家晚上好 ~ 当自己电脑文件很多还有点乱,不记得自己文件放哪里的时候,用电脑自带的搜索文件,这个等待时间可慢了 对我们这种敲代码的,这能忍吗,所以我们不如 ...

最新文章

  1. 牛顿迭代法的可视化详解
  2. 参加51CTO学院软考培训,我通过啦
  3. spring IOC容器设计理念与核心注解的使用
  4. 运维之我的nginx短篇教程
  5. php执行只读文件,php实现以只读方式打开文件的方法
  6. autowired用在static_java – @Autowired和static方法
  7. 3D游戏建模到底需要学习哪些美术基础?新手学习3D建模?
  8. NLP工具包(Albert+BiLSTM+CRF)
  9. 江苏计算机二级vb,江苏省计算机等级考试二级vb.ppt
  10. python入门神器下载_Python编程神器 v3.7.2 最新免费版
  11. Maya---之viewcube的寻找
  12. 免费得到高程地图的方法
  13. python ttk style,如何改变ttk.progressBar颜色在python
  14. Python爬取链家租房信息
  15. 织梦系统参数设置出现Token mismatch!提示的解决办法
  16. 电网数字化转型经验分享
  17. STP生成树协议(超详细小白也能看懂)
  18. 你想象不到这些明星竟然是程序员出身
  19. C语言—整除问题、求余、赋值、逻辑运算符易错点
  20. C# 农历日期帮助类

热门文章

  1. CF1397E Monster Invaders(思维+dp)
  2. 关于抽象类,接口的题目
  3. 怎么把文件拖到服务器里面,怎么把文件拖到远程服务器里面
  4. stm32cubeMX学习六、Freertos配置综合实践(移植大彩串口屏程序框架)
  5. 数字经济国际高级别会议在杭州开幕
  6. 四句话送给项目人:谦逊不狂、博而有专、聪而不明、束己驭人
  7. JHM3000体温传感器驱动
  8. 海航集团:曲折的发展历程
  9. 微软surface屏幕抖动_Microsoft放弃Windows E并显示浏览器投票屏幕
  10. Linux中kil命令和pkill命令的区别