编程 Python包用于缓存函数的返回结果,以便持久化并保存在本地

2024-11-18 10:34:48 +0800 CST views 720

Python包用于缓存函数的返回结果,以便持久化并保存在本地

这个Python包专门设计用于缓存函数的返回结果,以便将结果持久化并保存在本地。它能够基于函数的参数内容和代码变动来判定是否需要读取已有的缓存。适用于那些运行时间长、但结果不经常变化的函数。

如果有一个函数运行时间很长,但在参数不变的情况下结果保持一致,那么可以通过简单的缓存注解来提升效率,非常方便!

示例

假设我们有一个 add 函数,第一次运行需要4秒钟,后续有缓存后运行则瞬间完成:

import time
from cache_result import cache

@cache()
def add(a, b):
    time.sleep(4)
    return a + b

print("第一次运行需要花费4秒,再次运行只需要瞬间")
print(add(1, 2))

更多用法

1. 注意事项

需要在项目根目录创建一个 .projectroot 文件,用来标识项目根目录,这样缓存文件会统一创建在项目根目录中。

2. 分文件缓存

通过路径设置,可以将不同结果缓存到不同的文件夹中,并支持使用占位符。

缓存计算斐波那契数列的第n项,并通过占位符缓存到不同文件夹中:

import time
from cache_result import cache

@cache('cache/fib/{n}')
def fib(n):
    """计算斐波那契数列的第n项"""
    if n < 2:
        return n
    else:
        return fib(n-1) + fib(n-2)

if __name__ == '__main__':
    print("计算斐波那契数列花费时间:")
    start = time.time()
    print(fib(40))  # 第一次计算将花费一些时间
    print('Time: ', time.time()-start)

    print("如果cache中有缓存结果了,再次运行会非常快")
    print("删除cache中的内容即可重新执行函数")

3. 按时间缓存

如果需要按照时间使缓存失效,可以通过日期和时间来组织缓存文件,从而更高效地管理缓存。你可以自行控制完整的时间格式,例如下面的写法会将缓存维持一小时:

import time
from cache_result import cache

@cache("cache/{time:YYYY-MM-DD_HH}")
def add(a, b):
    time.sleep(4)
    return a + b

print("第一次运行需要花费4秒,在一个小时内再次运行只需瞬间")
print(add(1, 2))

4. 排除某些参数

如果某些输入参数不会影响输出结果,可以进行排除,这样即使这些参数改变,也不会导致重新计算缓存。例如下面代码中排除了 sleep 参数:

import time
from cache_result import cache

@cache("cache/{time:YYYY-MM-DD_HH}", exclude_args=['sleep'])
def add(a, b, sleep=4):
    time.sleep(sleep)
    return a + b

print("排除了sleep参数的影响,他的改变不会导致重新缓存")
print(add(1, 2))
print(add(1, 2, sleep=2))

5. 高级用法

缓存目录的层级方便用户管理,缓存文件生成后可以任意修改缓存目录的层级。例如,缓存目录原为 cache/a,可以直接改为 cache/b,然后将本地缓存文件从 a 复制到 b

更多信息

更多详细内容可以参考GitHub仓库:cache-result。如果有任何问题欢迎在仓库中留言交流。如果觉得这个工具好用,别忘了给个Star支持一下哦!

GitHub地址: cache-result

复制全文 生成海报 编程 Python 性能优化 缓存 开源

推荐文章

php客服服务管理系统
2024-11-19 06:48:35 +0800 CST
推荐几个前端常用的工具网站
2024-11-19 07:58:08 +0800 CST
设置mysql支持emoji表情
2024-11-17 04:59:45 +0800 CST
20个超实用的CSS动画库
2024-11-18 07:23:12 +0800 CST
底部导航栏
2024-11-19 01:12:32 +0800 CST
在 Rust 中使用 OpenCV 进行绘图
2024-11-19 06:58:07 +0800 CST
WebSocket在消息推送中的应用代码
2024-11-18 21:46:05 +0800 CST
mendeley2 一个Python管理文献的库
2024-11-19 02:56:20 +0800 CST
阿里云免sdk发送短信代码
2025-01-01 12:22:14 +0800 CST
JavaScript中的常用浏览器API
2024-11-18 23:23:16 +0800 CST
最全面的 `history` 命令指南
2024-11-18 21:32:45 +0800 CST
Golang 几种使用 Channel 的错误姿势
2024-11-19 01:42:18 +0800 CST
在 Nginx 中保存并记录 POST 数据
2024-11-19 06:54:06 +0800 CST
Python 基于 SSE 实现流式模式
2025-02-16 17:21:01 +0800 CST
Vue3中如何处理路由和导航?
2024-11-18 16:56:14 +0800 CST
Python 微软邮箱 OAuth2 认证 Demo
2024-11-20 15:42:09 +0800 CST
Vue3中的Slots有哪些变化?
2024-11-18 16:34:49 +0800 CST
Vue3中的响应式原理是什么?
2024-11-19 09:43:12 +0800 CST
CSS 特效与资源推荐
2024-11-19 00:43:31 +0800 CST
Vue3中如何处理WebSocket通信?
2024-11-19 09:50:58 +0800 CST
平面设计常用尺寸
2024-11-19 02:20:22 +0800 CST
Nginx rewrite 的用法
2024-11-18 22:59:02 +0800 CST
前端代码规范 - Commit 提交规范
2024-11-18 10:18:08 +0800 CST
MySQL 1364 错误解决办法
2024-11-19 05:07:59 +0800 CST
程序员茄子在线接单