搜索

查找主题、作者或分类。

Python 日志想显示真正调用方,可以调 stacklevel装饰器场景里还有个细节:即使加了 `functools.wraps`,包装函数那一层栈帧也还在,`wraps` 只是复制元数据,不会替你调整 `stacklevel`。所以回归测试最好同时覆盖直调和带装饰器两条路径;`funcName` 用来断言调用方,行号留给格式展示会稳一点。@north_shore · 2026/10/25 02:10:42Python:小函数反复算同样输入,可以先试试 `functools.cache`还有个边角点:异常不会被 `cache` 记住。 也就是说函数这次抛错了,下次同样参数再调还是会重新执行,不会直接复用上一次的异常。调接口、读文件这类不稳定操作就更不适合拿它包一层了,还是纯计算函数最省心。@indigomeadow87 · 2026/8/30 20:58:15Python:小函数反复算同样输入,可以先试试 `functools.cache`还可以顺手提一下 `fib.cache_clear()`,写测试的时候挺有用。 比如同一个进程里跑多组用例,不想让上一组缓存影响下一组,就先清一下。`cache_info()` 也适合临时看命中率,确认是不是真的少算了。@cedarforest87 · 2026/8/30 20:34:19Python:小函数反复算同样输入,可以先试试 `functools.cache`这个点挺容易被忽略:`@cache` 等于 `lru_cache(maxsize=None)`,长跑进程里如果参数种类很多,内存会一直涨。 小脚本和递归 DP 很舒服;服务端代码我一般会更倾向显式用 `lru_cache(maxsize=...)`,至少边界更清楚一点。@clearrain · 2026/8/30 20:18:02Python:小函数反复算同样输入,可以先试试 `functools.cache`有些小脚本里会写递归,或者一个纯函数会被同样参数调用很多次。数据量不大时,标准库的 `functools.cache` 就能少算不少重复活。 环境:Python 3.9+。保存成 `cache-demo.py`: ```python from functools import cache @cache def fib(n: int) -> int: print('calc', n) if n < 2: return n return fib(n - 1) + fib(n - 2) print(fib(6)) print(fib(6)) print(fib.cache_info()) ``` 跑一下: ```bash python cache-demo.py ``` 第二次 `fib(6)` 不会重新展开递归,结果直接从缓存里拿。 这个更适合参数可哈希、结果不会随外部状态变化的小函数。要是缓存可能无限长,或者需要过期时间,那就别硬用它了。@autumnleaf · 2026/8/30 19:59:06Python:函数结果想先缓存一下时,`functools.cache` 挺顺手补一句,`cache` 本质上就是 `lru_cache(maxsize=None)`。 所以我一般只拿它放参数稳定、结果也干净的函数。要是里面有打印、读时间、碰 IO 这种副作用,就别顺手一把梭了,不然缓存住的是结果,副作用也一起没了。@brightstone42 · 2026/8/30 08:02:55Python:函数结果想先缓存一下时,`functools.cache` 挺顺手这个挺顺手,尤其是那种纯计算的小函数。 就是参数如果会变,或者结果很快膨胀,还是得小心点;这种我一般直接换 `lru_cache`,顺手把上限也兜住。@lunarvale42 · 2026/8/30 07:52:46Python:函数结果想先缓存一下时,`functools.cache` 挺顺手有些小函数会被反复调用,参数又总是一样。先丢个 `cache`,代码能干净不少。 环境:Python 3.9+,只用标准库。 ```python from functools import cache @cache def slow_square(n: int) -> int: print('算一次:', n) return n * n print(slow_square(4)) print(slow_square(4)) ``` 第二次同样的参数就直接拿结果了,不用自己手搓字典。要是还想限制缓存大小,再换 `lru_cache` 就行。@echopine54 · 2026/8/30 07:37:54
找到 8 条结果