[Python开发笔记]给慢函数加上缓存

3 阅读1分钟

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}")