背景
前文(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
最后
每种方法都有它的作用范围,想要持续积累这类 “奇技淫巧” 还要多多关注我呀!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有