- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 Django 的新手。如果有人能区分 Django 中的 @cached_property 和 @lru_cache 装饰器,那将非常有帮助。另外我什么时候应该在 Django 中使用 which 装饰器。用例会很有帮助。谢谢。
最佳答案
首先,lru_cache
是 Python 语言本身从 3.4 版本开始提供的装饰器; cached_property
是 Django 提供多年的装饰器,直到 2019 年 10 月才被添加到 Python 语言的 3.8 版本中。也就是说,它们是相似的。
lru_cache
在函数式编程中特别有用。它所做的是用一组特定的参数保存函数调用的结果。当一个用lru_cache
装饰的函数以相同的参数被多次调用时,装饰器将只返回函数结果的缓存结果。这采用了一种称为 dynamic programming 的编程方法。 ,更具体地说,memoization .使用这些方法,您可以大大加快重复调用计算量大的函数的代码。
Python 还提供了另一个类似的装饰器,叫做 lfu_cache
。这两个装饰器都完成了内存,但是使用了不同的 replacement policies。 . lru_cache
(最近最少使用)将填充它的缓存,并且必须在下一个装饰函数调用期间踢出一些东西。此替换策略规定最近最少使用的条目将被新数据替换。 lfu_cache
(最不常用)指示根据最少使用的条目进行替换。
cached_property
类似于 lru_cache
,因为它缓存了昂贵的函数调用的结果。这里唯一的区别是它只能用于方法,这意味着函数属于一个对象。此外,它们只能用于除 self
之外没有其他参数的方法。在 Django 开发期间,您特别希望将其用于访问数据库的类上的方法。 Django docs提及它在具有属性方法 friends
的模型类上的用法。此方法可能会访问数据库以收集一组与该 Person
实例为 friend 的人。因为对数据库的调用很昂贵,所以我们希望缓存该结果以备后用。
关于python - @cached_property 和@lru_cache 装饰器的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49436833/
如何配置lru_cache根据接收到的实际值而不是如何调用函数来键入其缓存? >>> from functools import lru_cache >>> @lru_cache ... def f(
在运行下面的代码时,我收到 Python 无法导入 lru_cache 的错误。但是,每次导入(数学等)都会发生这种情况。我已经尝试了我可以在互联网上找到的每一个教程来尝试让这个东西工作。我已经重新安
我知道 cache_clear。但是我想知道如何清除单个调用的缓存。看到 cache_clear 不接受参数,我认为唯一的方法是直接弄乱底层字典。会有什么副作用(如果有的话)? 我们的目标是实现以下目
在 Python3 的 functools 包中,有一个 lru_cache() 装饰器可以内存您的函数调用。 有没有办法让我将这个缓存转储到一个文件中,然后再将文件加载回内存中? 我在 functo
我有一个带有方法/属性 multiplier 的对象。这个方法在我的程序中被多次调用,所以我决定在它上面使用lru_cache()来提高执行速度。正如预期的那样,它要快得多: 下面的代码显示了问题:
我试图了解 python (3) 中 lru_cache decorator 的实现,特别是它如何从函数 创建 key args 为其内部 dict。 我一直在读这篇文章https://github.
我正在尝试为一些计算科学代码组合数据类、属性和 lru_caches: from dataclasses import dataclass from typing import Any from fu
我在使用 django 应用程序的日志中收到此错误。我认为使用 Python 2.x 时会发生此类错误,但在我的虚拟环境中会发生 Python - 3.6.5 . Django - 2.0.7 .带有
根据documentation lru_cache 的默认值来自 functools是 128。但是没有定义单位。 Decorator to wrap a function with a memoiz
我在 Windows 上使用 Python 3.7 运行每个代码时都会发生此错误: Traceback (most recent call last): File "test.py", line
我有一个像这样的 Python 单调度通用函数: @singledispatch def cluster(documents, n_clusters=8, min_docs=None, depth=2
是否可以在项目被逐出时为 functools.lru_cache 定义回调?在回调中,缓存的值也应该存在。 如果没有,也许有人知道支持逐出和回调的轻量级类字典缓存? 最佳答案 我将发布我使用的解决方案
我想要一个可以使用 functools.lru_cache 的函数,但默认情况下不能。我正在寻找一种方法来使用可用于禁用 lru_cache 的函数参数。目前,我有两个版本的函数,一个有 lru_ca
这个问题在这里已经有了答案: How do I use cache_clear() on python @functools.lru_cache (3 个答案) 关闭 6 年前。 有什么方法可以覆盖
在评论中:Is there a decorator to simply cache function return values? @gerrit 指出了将可变但可散列的对象用于带有 functool
是否可以使用 functools.lru_cache 来缓存由 functools.partial 创建的部分函数? 我的问题是一个函数,该函数采用可散列参数和常量、不可散列对象(例如 NumPy 数
我有一个将(以及其他)字典作为参数的方法。该方法是解析字符串,字典提供了一些子字符串的替换,所以它不必是可变的。 这个函数经常被调用,而且在冗余元素上,所以我认为缓存它会提高它的效率。 但是,正如您可
这是我要通过缓存增强的功能的框架,因为执行RPC(远程过程调用)涉及到其他主机的TCP连接。 def rpc(rpc_server, rpc_func, arg): return rpc_se
这是我的情况,is_exist功能有性能问题。 def is_exist(link :str) -> bool: if query_db(link) is True: ret
作为并行化一些现有代码(使用多处理)的一部分,我遇到了类似于下面类的东西需要被 pickle 的情况。 从...开始: import pickle from functools import lru_
我是一名优秀的程序员,十分优秀!