面试题答案
一键面试原理
- 缓存机制:
functools.lru_cache
装饰器为函数创建了一个缓存。当函数被调用时,它会先检查缓存中是否已经存在该函数以当前参数调用的结果。 - 哈希表存储:它使用一个哈希表来存储函数参数及其对应的返回值。如果参数是可哈希的(如不可变类型:整数、字符串、元组等),就可以作为哈希表的键。当以相同参数再次调用函数时,直接从哈希表中返回缓存的结果,而无需再次执行函数体中的代码。
- 缓存清理:当缓存达到一定大小(默认情况下,LRU 缓存可以容纳 128 个最近使用的结果),采用最近最少使用(LRU, Least Recently Used)策略来删除旧的缓存条目,为新的条目腾出空间。
适用场景
- 计算密集型函数:对于那些执行时间长、计算复杂的函数,例如递归计算斐波那契数列等。每次使用相同参数调用都重新计算会消耗大量时间,使用
lru_cache
可以显著提高性能。 - 参数相对固定的函数:如果函数的参数在多次调用中相对固定,缓存的命中率会比较高,能有效提升效率。例如配置读取函数,在程序运行期间配置通常不会改变,缓存结果可以避免重复读取配置文件。
- 递归函数:在递归调用过程中,如果存在大量重复计算的子问题,使用
lru_cache
可以缓存中间结果,避免重复递归计算,极大地优化性能。例如在解决动态规划问题时常用的递归函数。