- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图了解 python (3) 中 lru_cache
decorator
的实现,特别是它如何从函数 创建
为其内部 key
argsdict
。
我一直在读这篇文章https://github.com/python/cpython/blob/master/Lib/functools.py#L414
我无法理解为什么函数中会有这个kwd_mark = (object(),)
。我看到它正在创建一个仅包含 object()
实例的 tuple
,看起来它就像所有 args 之间的分隔符
和 kwargs/kwds
用于函数调用的key
。我想了解它是否在这里做了什么特别的https://repl.it/repls/ExpensiveFinishedSandboxes但我想不出什么。
最佳答案
链接很好,但它们很容易损坏,所以我会尝试将所有内容直接包含在答案中。我们有一个像这样的函数(简化):
def make_key(args, kwds, kwd_mark = (object(),)):
key = args
if kwds:
key += kwd_mark
for item in kwds.items():
key += item
...
return key
那里的评论相当具有描述性:
Make a cache key from <...> positional and keyword arguments. The key is constructed in a way that is flat as possible rather than as a nested structure that would take more memory.
让我们尝试一些示例运行:
>>> print(make_key((1, 2, 3), dict()))
(1, 2, 3)
>>> print(make_key((1, 2, 3), dict(a='x', b='y')))
(1, 2, 3, <object object at 0x7f6faf99d0c0>, 'a', 'x', 'b', 'y')
>>> print(make_key((1, 2, 4), dict(b='y', a='x')))
(1, 2, 4, <object object at 0x7f6faf99d0c0>, 'b', 'y', 'a', 'x')
结果是一个可散列元组,表示用户调用其 user_function
的参数。和。正如您所指出的,kwd_mark
用作 args 和 kwargs 之间的哨兵值,以便单独缓存以下调用:
user_function(1, 2, 3, 'a', 'x')
user_function(1, 2, 3, a='x')
<小时/>
我们本可以使用None
作为分隔符,但是如果有人用 None
调用函数怎么办?作为参数?而object()
是Python中基类的一个对象,它本身并没有做太多事情,它的唯一性很有用。如果您的分隔符是独一无二的,则不能将参数与分隔符混淆!而且由于这个哨兵是在函数定义时创建的,因此它在程序运行过程中将保持不变(请注意,上面的结果引用相同的 <object object at 0x7f6faf99d0c0>
),因此它的哈希值将是相同的。
你可能会问,为什么不做 kwd_mark=object()
?我认为这里的原因是它仅用于将其“附加”到元组,因此否则您每次都必须创建一个新元组(请记住,元组是不可变的):
def make_key(args, kwds, kwd_mark=object()):
key = args
if kwds:
key += (kwd_mark, ) # new tuple
for item in kwds.items():
key += item
关于Python lru_cache 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48941388/
如何配置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_
我是一名优秀的程序员,十分优秀!