数据类的简单sqlite支持的持久缓存

cachew的Python项目详细描述


circleci

cachew:quick namedtuple/dataclass缓存

tldr:cachew可以持久地缓存任何序列(an迭代器)在namedtuples数据类到磁盘上的sqlite数据库中。 数据库模式是根据类型注释自动推断出来的(pep 526)。

它的工作方式与functools.lru cache rel="nofollow">functools.lru cache类似:缓存数据只是修饰它而已。

functools.lru缓存的不同之处在于,程序运行之间会保留数据。

动机

我经常发现自己在处理大量的数据,计算其中的一些集合,或者只提取我感兴趣的部分。当我试图尽可能多地使用repl时,有些东西仍然很脆弱,而且在开发过程中经常需要重新运行整个过程。如果数据解析和处理只需几秒钟,在某些情况下更不用说几分钟,这可能会令人沮丧。

处理它的传统方法是序列化结果以及某种类型的输入文件散列(如md5)。 在下次运行时进行比较,如果没有更改,则返回缓存数据。

虽然听起来很简单,但每次你需要记住一些数据,用例行程序污染代码,分散你对主要任务的注意力时,这样做是相当乏味的。

示例

假设您正在为一些大型数据集(比如,从Wikipedia存档中提取URL及其标题)开发数据分析管道。 解析它(提取链接函数)需要几个小时,但是,存档可能更新得不太频繁。

有了这个库,您可以通过一个@cachew装饰器来实现它。

>>>fromtypingimportNamedTuple,Iterator>>>classLink(NamedTuple):...url:str...text:str...>>>@cachew...defextract_links(archive:str)->Iterator[Link]:...foriinrange(5):...importtime;time.sleep(1)# simulate slow IO...yieldLink(url=f'http://link{i}.org',text=f'text {i}')...>>>list(extract_links(archive='wikipedia_20190830.zip'))# that would take about 5 seconds on first run[Link(url='http://link0.org',text='text 0'),Link(url='http://link1.org',text='text 1'),Link(url='http://link2.org',text='text 2'),Link(url='http://link3.org',text='text 3'),Link(url='http://link4.org',text='text 4')]>>>fromtimeitimportTimer>>>res=Timer(lambda:list(extract_links(archive='wikipedia_20190830.zip'))).timeit(number=1)# second run is cached, so should take less time>>>print(f"took {int(res)} seconds to query cached items")took0secondstoquerycacheditems

工作原理

基本上,您的数据对象会变平 python类型映射到sqlite类型并返回

调用函数时,cachew计算函数参数的哈希值 并将其与先前存储的哈希值进行比较。

如果它们匹配,它将反序列化并产生缓存数据库中存储的任何内容;如果哈希不匹配,则调用原始数据提供程序,并将新数据与新哈希一起存储。

功能

使用

有关参数和返回类型的最新文档,请参见docstring。 您还可以使用广泛的单元测试作为参考。

一些亮点:

  • 缓存路径可以是文件名,也可以指定一个可调用的返回路径并取决于函数的参数。

    不需要指定路径(它将在/tmp中创建),但建议使用。

  • hashf默认情况下,仅对所有参数进行哈希运算,您还可以指定一个自定义的可调用项。

    例如,它可用于放弃缓存输入文件已被修改。

  • cls默认情况下是从返回类型注释推导出来的,但如果不控制要缓存的代码,则可以指定它。

安装

TODO

实施

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何通过循环Id数组设置按钮Id,并使用循环设置按钮文本?   java在一个JTextField中添加字符串和int值   java如何解析2006年2月20日这样的日期?   java Android我试图从SharePreference获取数据   java如何在springboot中将ObjectId转换成字符串   java如何在ListActivity中将按钮返回工具栏   web服务如何使用免费API或web服务从java程序向手机发送短信   java Udp如何从服务器获取整数?   使用DAM资产进行java AEM JUnit测试   数组Java程序循环不会执行并提示用户?   安卓上的java改造2和xml   java 安卓中有字典数据类型吗?   java如何单元测试guice createinjector方法   java无法为Pulsar设置Zookeeper群集   java我无法解密发送消息AES   Java中的tomcat异步   java如何修复“OAutheException,errorMessage:(#803)您请求的某些别名不存在:您的(应用程序)ID}”   java通过构造函数传递整数