functools.lru_cache()
给慢函数加上缓存。
怎么用?举例说明⬇️:
import time
from functools import lru_cache
@lru_cache(maxsize=5)
def calculate_score(class_id):
print(f"Calculating score for class: {class_id}...")
time.sleep(60)
return 42
calculate_score(5)
然后你使用python x.py
指令执行这段脚本发现每次时间都一样,并没有第二次缓存命中的效果,问题在于代码执行方式。lru_cache
装饰器确实能够缓存函数的结果,但是它的缓存是在同一个 Python 进程中有效。如果每次都是重新运行 Python 文件(比如在命令行使用 python x.py
),那么每次都会启动一个新的 Python 进程,缓存就会重新初始化,所以还是会重新计算。
需要尝试的话直接在Python IDLE
中执行即可。
或者,
用下面提供的脚本测试,这样单次运行是可以保证在同一个进程中的:
import time
from functools import lru_cache
@lru_cache(maxsize=5)
def calculate_score(class_id):
print(f"Calculating score for class: {class_id}...")
time.sleep(2) # 为了演示效果,我们把时间改短一点
return 42
# 第一次调用,会执行计算
print("First call:")
result1 = calculate_score(5)
print(f"Result: {result1}")
# 第二次调用,会使用缓存
print("\nSecond call:")
result2 = calculate_score(5)
print(f"Result: {result2}")
# 使用不同的参数调用,会重新计算
print("\nCall with different parameter:")
result3 = calculate_score(6)
print(f"Result: {result3}")
# 再次使用第一个参数调用,会使用缓存
print("\nThird call with first parameter:")
result4 = calculate_score(5)
print(f"Result: {result4}")