几种流行的 Python 性能加速方案对比

您所在的位置:网站首页 python中没有include 几种流行的 Python 性能加速方案对比

几种流行的 Python 性能加速方案对比

2023-03-17 01:39| 来源: 网络整理| 查看: 265

众所周知,Python 在几种常用的脚本语言(Ruby、JavaScript、Lua 等)中,速度是垫底的的存在。业界在上面也投入了很大精力,提供了各种各样的解决方案,各有各的优缺点,下面对这些解决方案做一些简单的介绍。

官方方案

首先不得不提的是Python之父参与的“香农计划”,在 2021 年 5 月的 Python 语言峰会上,Python 之父 Guido van Rossum 作了一场《Making CPython Faster 》的分享,宣布投入该计划,要在未来四年内将 CPython 速度提升 5 倍。 方案上涉及 CPython 一系列细节上的改进,有兴趣的可以自行搜索,最新进展是在 Python 3.11 版本,提速 10-60%。 作为用户只需等官方进展,升级 Python 版本既可。

PyPy

PyPy 是一种快速、兼容的 Python 替代实现,得益于其 Just-in-Time 编译器,Python 程序在 PyPy 上通常运行得更快。官方提供的基准测试相比 CPython 3.7 快 4.8 倍。安装使用上和官方的 Python 一样。最新版本 PyPy 3.9,相比官方的 Python 3.11 新特性可能不支持。

Cython

Cython 是一种针对 Python 和扩展的 Cython(基于 Pyrex)的优化静态编译器。它可以让我们为 Python 编写 C 扩展时,像编写 Python 本身一样简单。最著名的项目就是 numpy。 与 Python 不同,Cython 代码必须被编译。这发生在两个阶段:

Cython 将 .pyx 或 .py 文件编译为 .c 文件,其中包含 Python 扩展模块的代码。.c 文件由 C 编译器编译为 .so 文件(或 Windows 上的 .pyd),该文件可以直接导入到 Python 会话中。 setuptools 负责这一部分。尽管 Cython 可以在某些情况下为您调用它们。

下面看一个简单的样例。假设 hello.pyx 文件中有一个简单的 “hello world”脚本:

import cython def say_hello_to(name): print("Hello %s!" % name) def f(double x): return x ** 2 - x def integrate_f(double a, double b, int N): cdef int i cdef double s cdef double dx s = 0 dx = (b - a) / N for i in range(N): s += f(a + i * dx) return s * dx

下面是相应的 setup.py 脚本

from setuptools import setup from Cython.Build import cythonize setup( name='Hello world app', ext_modules=cythonize("hello.pyx"), zip_safe=False, )

要构建,请运行 python setup.py build ext --inplace​ 命令。然后简单地启动一个 Python 终端,既可导入使用相关函数:

from hello import say_hello_to, integrate_f

我们也可以借助 Python 的类型注释,在写法时候更接近 Python 一点:

import cython def f(x: cython.double): return x ** 2 - x def integrate_f(a: cython.double, b: cython.double, N: cython.int): i: cython.int s: cython.double dx: cython.double s = 0 dx = (b - a) / N for i in range(N): s += f(a + i * dx) return s * dxNumba

Numba 是一个开源的、支持 numpy 的 Python 优化编译器,由 Anaconda, Inc.赞助。它使用 LLVM 从 Python 语法生成机器代码。它在使用 numpy 数组、函数和循环的代码上工作得最好。往往在数据分析、科学计算领域使用的比较多。 使用上比较简单,就是在我们 Python 函数上添加装饰器,相比其他方案(替换解释器、用其他语言编译等)工作流上侵入性比较小。

from numba import njit import random @njit def monte_carlo_pi(nsamples): acc = 0 for i in range(nsamples): x = random.random() y = random.random() if (x ** 2 + y ** 2) PyResult { Ok((a + b).to_string()) } /// A Python module implemented in Rust. The name of this function must match /// the `lib.name` setting in the `Cargo.toml`, else Python will not be able to /// import the module. #[pymodule] fn string_sum(_py: Python


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3