大家好,我是启航。
之前发的原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。
正式开始之前,多唠叨两句。我司发力多个赛道的游戏,其中包括某鱼类游戏Top2项目,拿过阿拉丁神灯奖的SLG卡牌小游戏项目和海外三消游戏。这些不同类型的游戏,后端大多是使用的是pypy。对于如何使用pypy,我有一点使用经验可以聊聊。话不多说,正式开始,本文包括下面几个部分:
-
语言分类
-
python的解释器实现
-
pypy为什么快
-
性能比较
-
性能优化方法
-
pypy的特性
-
小结
语言分类
我们先从最基本的一些语言分类概念聊起,对这部分内容非常了解的朋友可以跳过。
静态语言 vs 动态语言
如果在编译时知道变量的类型,则该语言为静态类型。静态类型语言的常见示例包括Java,C,C ++,FORTRAN,Pascal和Scala。在静态类型语言中,一旦使用类型声明了变量,就无法将其分配给其他不同类型的变量,这样做会在编译时引发类型错误。
# java
int data;
data = 50;
data = “Hello Game_404!”; // causes an compilation error
如果在运行时检查变量的类型,则语言是动态类型的。动态类型语言的常见示例包括JavaScript,Objective-C,PHP,Python,Ruby,Lisp和Tcl。在动态类型语言中,变量在运行时通过赋值语句绑定到对象,并且可以在程序执行期间将相同的变量绑定到不同类型的对象。
# python
data = 10;
data = "Hello Game_404!"; // no error caused
data = data + str(10)
一般来说静态语言编译成字节码执行,动态语言使用解释器执行。编译型语言性能更高,但是较难移植到不同的CPU架构体系和操作系统。解释型语言易于移植,性能会比编译语言要差得多。这是频谱的两个极端。
强类型语言 vs 弱类型语言
强类型语言是一种变量被绑定到特定数据类型的语言,如果类型与表达式中的预期不一致,将导致类型错误,比如下面这个:
# python
temp = “Hello Game_404!”
temp = temp + 10; // program terminates with below stated error (TypeError: must be str, not int)
python和我们感觉不一致,背叛了弱类型语言,不像世界上最好的语言:(
# php
$temp = “Hello Game_404!”;
$temp = $temp + 10; // no error caused
echo $temp;
常见编程语言的象限分类如下图:
language
这一部分内容主要翻译自参考链接1
python的解释器实现
python是一门动态编程语言,由特定的解释器解释执行。下面是一些解释器实现:
-
CPython 使用c语言实现的解释器
-
PyPy 使用python语言的子集RPython实现的解释器,一般情况下PyPy比CPython快4.2倍
-
Stackless Python 带有协程实现的解释器
-
Jython Java实现的解释器
-
IronPython .net实现的解释器
-
Pyston 一个较新的实现,是CPython 3.8.8的一个分支,具有其他针对性能的优化。它针对大型现实应用程序(例如Web服务),无需进行开发工作即可提供高达30%的加速。
-
...
还有几个相关概念:
-
IPython && Jupyter ipython是使用python构建的交互式shell, Jupyter是其web化的包装。
-
Anaconda 是一个python虚拟环境,Python数据科学常用。
-
mypyc 一个新的项目,将python编译成c代码库,以期提高python的运行效率。
-
py文件和pyc文件 pyc文件是python编译后的字节码,也可以由python解释器执行。
-
wheel文件和egg文件 都是项目版本发布的打包文件,wheel是最新标准。
-
...
这里