【发布时间】:2023-03-13 14:55:01
【问题描述】:
这是我的情况,is_exist 函数有性能问题。
def is_exist(link :str) -> bool:
if query_db(link) is True:
return True
return False
def process(link: str)
if is_exist(link) is True:
return
# do something
# put result to database
LRU 缓存是一个很好的解决方案,但经过数小时的努力,我发现 lru_cache 不符合我的要求。我想要的是这样的:
def is_exist(link :str) -> bool:
if query_db(link) is True:
return True
return False
def process(link: str)
if lru_cache.query(link) is True:
return
if is_exist(link) is True:
lru_cache.add(link)
return
# do something
# put result to database
functiontools 中的 LRU Cache 是一个装饰器。它没有查询方法。如果我使用@lru_cache 装饰is_exist 某些链接会在is_exist 返回false 时重复处理。
PS:把结果放到数据库是异步的
【问题讨论】:
-
你能更清楚你真正想要发生的事情吗? @sophros 的答案是在此处适当使用
@lru_cache,但这似乎不是您想要的。你想装饰 both 函数吗(我怀疑它,因为它没有返回任何有用的东西)? -
我想问题是,如果第一次从 is_exists 返回 False,则使用 lru_cache 即使将链接写入数据库,该值也将始终返回 - 即 OP 需要一种方法来使 lrucache 无效当链接最初不存在但随后已在数据库中创建时。
-
@AndrewJaffe 我已经评论了 sophros 的回答。
-
通过没有两个函数来避免这个问题 - 组合成一个 lru_cache-d 函数,看我的回答
-
您的标题询问为什么该功能不存在。您的描述询问如何解决它。你对这两者中的哪一个真正感兴趣?
标签: python python-3.x caching lru