首页后端开发Python两行代码让 Python 性能超越 C++ 3 个数量级

两行代码让 Python 性能超越 C++ 3 个数量级

时间2023-03-24 17:29:17发布访客分类Python浏览1350
导读:背景前文(Python 搭配 C++ 让性能直接拉满 我们讲到,如果有部分热点函数其性能不行,我们可以把 Python 代码改写成 C/C++ 代码以此来提升性能。经验上来看这种做法可能提升一到两个数量级多数情况下能解决问题。 这个处理方式...

背景

前文(Python 搭配 C++ 让性能直接拉满)我们讲到,如果有部分热点函数其性能不行,我们可以把 Python 代码改写成 C/C++ 代码以此来提升性能。经验上来看这种做法可能提升一到两个数量级多数情况下能解决问题。

这个处理方式相对来讲要求会高一些,它要求开发者对 Python 和 C/C++ 都要熟悉,并且可以随便切换。

多年的摸爬滚打,我在 Python 标准库中发现了一些“奇技淫巧”;有些技术可以做到一两行代码让性能原地起上天。


问题回顾

还是书接上回,在算法不变的情况下,C++ 要比 Python 快几十倍。上一次测试的算法与耗时情况如下。


#/usr/bin/env python3

"""
测试 Python &
 C++ 这两种语言计算 斐波那契数列 的快慢。
"""

from datetime import datetime

# 导入我写的 C++ 库
from plugins import cppmath

def fib(n):
    """求 斐波那契数列 的第 n 位的值
    Parameter:
    ----------
    n: int
        第 n 位

    Return:
    -------
    int
        返回斐波那契数列第 n 位的值
    """
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)

def main(n):
    """分别测试 C++ 和 Python 计算同一个数的耗时
    """
    start = datetime.now()
    res = cppmath.fib(n)
    end = datetime.now()
    print("C++ 计算的结果为    {
}
 总的耗时 {
}
(s)".format(res, end-start))

    start = datetime.now()
    res = fib(n)
    end = datetime.now()
    print("Python 计算的结果为 {
}
 总的耗时 {
}
    (s)".format(res, end-start))

if __name__ == "__main__":
    main(40)
python3 test-fib-speed.py 
C++ 计算的结果为    102334155 总的耗时 0:00:00.140350(s)
Python 计算的结果为 102334155 总的耗时 0:00:11.720886(s)

优化原理

大多数情况下我们没有性能又好,成本又低的代码实现;通常是我们要失去一部分 xxx ,来换取一部分的 zzz 。

对于有些递归算法来说,有一个非常有效果的办法就是用一部分 “内存资源” 来换取 “计算速度” 的提升。

比如我们算 fib(5) 的时候它依赖于 fib(4) + fib(3) ,当我们计算 fib(4) 的时候它依赖于 fib(3) + fib(2) 。可以看到 fib(3) 重复计算了,我们可以把第一次计算的 fib(3) 结果缓存起来,这样第二次的时候就可以不用算了。

标准库中有一个叫 functools 的模块,它里的工具函数就有专门用来做这个的,比较典型的一个就是 lru_cache 函数。下面我们改一下之前的代码,只要加两行就行了。

from functools import lru_cache

# 这个装饰器会给我们做完成所有事
@lru_cache(maxsize=1024)
def fib(n):
    """求 斐波那契数列 的第 n 位的值
    Parameter:
    ----------
    n: int
        第 n 位

    Return:
    -------
    int
        返回斐波那契数列第 n 位的值
    """
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)

之前运行耗时是这样的

python3 test-fib-speed.py 
C++ 计算的结果为    102334155 总的耗时 0:00:00.140350(s)
Python 计算的结果为 102334155 总的耗时 0:00:11.720886(s)

现在的运行耗时是这样的

python3 test-fib-speed.py
C++ 计算的结果为    102334155 总的耗时 0:00:00.139594(s)
Python 计算的结果为 102334155 总的耗时 0:00:00.000047(s)

我算了一下性能差异,就 2900 来倍吧!

In [1]: 139594 /47
Out[1]: 2970.0851063829787

最后

每种方法都有它的作用范围,想要持续积累这类 “奇技淫巧” 还要多多关注我呀!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

c++python函数算法性能

若转载请注明出处: 两行代码让 Python 性能超越 C++ 3 个数量级
本文地址: https://pptw.com/jishu/235.html
vue权限路由实现方式总结(vue路由实现权限管理) 新技能 | 使用python代码来高效操作Excel表格 (文末赠书5本)

游客 回复需填写必要信息