Python面试题:Python中的记忆化与缓存技术

在Python中,记忆化(Memoization)和缓存(Caching)技术是用来提高函数执行效率的重要方法。它们通过存储已经计算过的结果来避免重复计算,尤其适用于计算量大、重复调用多的函数。

记忆化(Memoization)

记忆化是一种缓存技术,主要用于递归函数中。它通过保存之前计算过的结果,避免重复计算。

手动实现记忆化

我们可以使用一个字典来手动实现记忆化。以下是计算斐波那契数列的例子:

python 复制代码
def fib(n, memo={}):
    if n in memo:
        return memo[n]
    if n <= 1:
        return n
    memo[n] = fib(n-1, memo) + fib(n-2, memo)
    return memo[n]

# 测试
print(fib(10))  # 输出 55

在这个例子中,我们使用 memo 字典来存储已经计算过的斐波那契数。当我们需要计算一个新的斐波那契数时,首先检查它是否在 memo 中,如果在则直接返回结果,否则进行计算并将结果存储在 memo 中。

使用 functools.lru_cache

Python提供了一个更方便的记忆化方法,就是使用 functools 模块中的 lru_cache 装饰器。LRU 代表最近最少使用(Least Recently Used),它可以自动管理缓存的大小。

示例
python 复制代码
from functools import lru_cache

@lru_cache(maxsize=None)  # maxsize 为缓存的最大数量,设置为 None 表示无限制
def fib(n):
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)

# 测试
print(fib(10))  # 输出 55

使用 @lru_cache 装饰器,我们无需手动管理缓存,functools.lru_cache 会自动处理所有细节,包括缓存的大小和过期策略。

缓存(Caching)

缓存不仅限于递归函数,还可以用于任何需要存储和重用计算结果的场景。常见的缓存库包括 cachetoolsrequests-cache

使用 cachetools

cachetools 提供了多种缓存策略,包括LRU缓存、LFU缓存等。

python 复制代码
from cachetools import LRUCache, cached

cache = LRUCache(maxsize=100)

@cached(cache)
def expensive_function(x):
    print(f"Computing {x}")
    return x * x

# 测试
print(expensive_function(4))  # 输出 "Computing 4" 和 16
print(expensive_function(4))  # 仅输出 16,因为结果被缓存了
使用 requests-cache

requests-cache 是一个用于缓存HTTP请求的库,可以极大地提高网络请求密集型应用的性能。

python 复制代码
import requests
from requests_cache import CachedSession

# 创建一个缓存会话
session = CachedSession('demo_cache', expire_after=300)

# 发送HTTP请求
response = session.get('https://api.github.com')

# 测试
print(response.json())

在这个例子中,requests-cache 会将HTTP请求的响应缓存起来,避免短时间内重复请求同一个URL,提高了性能。

总结

记忆化和缓存技术是Python中优化计算性能的有效方法。记忆化主要用于递归函数,常通过手动实现或使用 functools.lru_cache 装饰器来实现。缓存则更广泛地应用于需要重用计算结果的场景,可以使用 cachetoolsrequests-cache 等库来实现。通过合理地使用这些技术,可以显著提高程序的执行效率。

相关推荐
belldeep7 分钟前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手7 分钟前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
m0_736919108 分钟前
C++中的委托构造函数
开发语言·c++·算法
喵手19 分钟前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出
lsx20240622 分钟前
Python3 SMTP发送邮件教程
开发语言
懈尘23 分钟前
从 Java 1.7 到 Java 21:逐版本深入解析新特性与平台演进
java·开发语言
凉辰26 分钟前
使用uni.createInnerAudioContext()播放指定音频(踩坑分享功能)
开发语言·javascript·音视频
hello 早上好28 分钟前
05_Java 类加载过程
java·开发语言
B站_计算机毕业设计之家36 分钟前
猫眼电影数据可视化与智能分析平台 | Python Flask框架 Echarts 推荐算法 爬虫 大数据 毕业设计源码
python·机器学习·信息可视化·flask·毕业设计·echarts·推荐算法
PPPPPaPeR.40 分钟前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法