pypy简介

  • 项目背景

    PyPy [1] 是Python开发者为了更好的Hack Python创建的项目。此外,PyPy比CPython是更加灵活,易于使用和试验,以制定具体的功能在不同情况的实现方法,可以很容易实施。 该项目的目标是,让PyPy比C实现的Python更为容易的适应各个项目和方便裁剪。

  • 现状介绍

    • PyPy是Armin Rigo开发的,Python语言的动态编译器,是Psyco的后继项目。PyPy的目的是,做到Psyco没有做到的动态编译

    • PyPy开始只是研究性质的项目。但是开发非常成熟,在2007年中旬发布了1.0 Release版本后,大家关注的焦点是,能否在2008年出现可供生产环境使用的版本。

    • 最新的(2018.12.15)PyPy版本是PyPy3 v6.0.0,兼容Python3.5.3。可以运行在Linux的32位和64位、MacOSX和Windows的32位平台中,但是基于arm平台的正在开发中。它支持Python语言的所有核心部分以及大多数的Python语言标准库函数模块,并且通过了Python语言的test suite。与CPython的区别可以去看它的兼容性页面.

    • PyPy还提供了JIT编译器和沙盒功能,因此运行速度比CPython要快,以及可以安全的运行一些不被信任的代码。PyPy还有一个单独的支持微线程的版本。

    • 另外,PyPy 也有 每夜构建 版本供开发者测试。

    • PyPy是作为Specific Targeted Research Projects(特定领域研究项目)从2004年12月到2007年3月,开始接受欧盟的援助。

  • 实现原理

    • PyPy的第一部分:用Python实现的Python

    • 其实这么说并不准确,准确得说应该是用rPython实现的Python,rPython是Python的一个子集,虽然rPython不是完整的Python,但用rPython写的这个Python实现却是可以解释完整的Python语言。

    • PyPy的第二部分:编译器

    • 这是一个编译rPython的编译器,或者说这个编译器有一个rPython的前端,目前也只有这么一个前端,不过它的后端却是不少,也就是说这个编译器支持许多的目标语言,比较重要的有:CCILJavascript … [2]

    主要特性

    • 大量的性能改进。
    • Bug修复,以及与CPython的兼容性修复。
    • 现在stackless功能默认启用。
    • NumPy effort现在更名为numpypy,使用时可以简单写作:import numpypy as numpy。
    • JSON编码器已被替换为一个新的,是用纯Python编写的,某些情况下比CPython的C扩展快2倍,比PyPy 1.6中的快20倍左右。
    • 一些RPython模块的内存占用已得到大幅改善。

    另外,有一些功能正在开发,将包含在1.8版本中,这些功能包括:

    • 特殊列表实现。可以大幅改善一些应用程序的性能/内存影响。
    • NumPy effort即将支持多维数组。
    • 两个新的JIT编译器后端,尤其针对PowerPCARM处理器

一、python多线程

from django.test import TestCase

# Create your tests here.
import threading

num = 0


def change_it(n):
    global num
    for i in range(1000000):
        num = num + n
        num = num - n
    print(num)


threads = [
    threading.Thread(target=change_it, args=(8,)),
    threading.Thread(target=change_it, args=(10,)),
    threading.Thread(target=change_it, args=(5,))
]

[t.start() for t in threads]
[t.join() for t in threads]
print(num)

我们运行三次

第一次

10
0
-5
-5

第二次

0
10
10
10

第三次

0
8
18
18

二、pypy3多线程

from django.test import TestCase

# Create your tests here.
import threading

num = 0


def change_it(n):
    global num
    for i in range(1000000):
        num = num + n
        num = num - n
    print(num)


threads = [
    threading.Thread(target=change_it, args=(8,)),
    threading.Thread(target=change_it, args=(10,)),
    threading.Thread(target=change_it, args=(5,))
]

[t.start() for t in threads]
[t.join() for t in threads]
print(num)

我们运行三次

第一次

0
0
0
0

第二次

0
0
0
0

第三次

0
0
0
0

我们发现pypy3在处理多线程的时候是比python处理能力更强

三、我们再看接下来的比较

import time

s1 = time.time()

ss = [x ** 2 for x in range(10000000)]
print("运行时间:", time.time() - s1)

pypy3运行速度是不如python的

所以我们在合适的地方选择合适解释器

并没有一个解释器是完美的