- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个像这样的 Python 单调度通用函数:
@singledispatch
def cluster(documents, n_clusters=8, min_docs=None, depth=2):
...
它是这样重载的:
@cluster.register(QuerySet)
@lru_cache(maxsize=512)
def _(documents, *args, **kwargs):
...
第二个基本上预处理 QuerySet
对象并调用通用 cluster()
函数。一个QuerySet is a Django object ,但这不应该在这里发挥作用;除此之外,它是可散列的,因此可以与 lru_cache
一起使用。
通用函数无法缓存,因为它接受不可散列的对象(例如列表)作为参数。但是,由于 QuerySet
对象是可散列的,因此可以缓存重载函数。这就是我添加 @lru_cache()
注释的原因。
但是,缓存似乎没有应用:
qs: QuerySet = [...]
start = datetime.now(); cluster(Document.objects.all()); print(datetime.now() - start)
0:00:02.629259
我希望在实例中发生相同的调用,但是:
start = datetime.now(); cluster(Document.objects.all()); print(datetime.now() - start)
0:00:02.468675
缓存统计信息证实了这一点:
cluster.registry[django.db.models.query.QuerySet].cache_info()
CacheInfo(hits=0, misses=2, maxsize=512, currsize=2)
更改 @lru_cache
和 @.register
注释的顺序似乎没有什么区别。
This question类似,但答案不适合单个功能级别。
是否有可能在这个级别上组合这两个注释?如果是这样,怎么办?
最佳答案
hash(Document.objects.all()) == hash(Document.objects.all())
与 Django QuerySet
不一致。
在评估返回的 QuerySet
之前,调用 Document.objects.all()
不会访问数据库。
Pickling is usually used as a precursor to caching
根据您的用例,您可以尝试缓存 QuerySet
的 pickle 或其 query
属性。
@cluster.register(bytes)
@lru_cache(maxsize=512)
def _(documents, *args, **kwargs):
documents = pickle.loads(documents)
...
cluster(pickle.dumps(Document.objects.all()))
或
cluster(pickle.dumps(Document.objects.all().query))
关于python - 如何结合@singledispatch和@lru_cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60415891/
我正在测试 python 的 singledispatch:https://docs.python.org/3/library/functools.html?highlight=singledispa
我希望能够做到这一点: from typing import Type from functools import singledispatch class A: pass class B(A
Python 3.4 added使用静态方法定义函数重载的能力。这基本上是文档中的示例: from functools import singledispatch class TestClass(ob
functools.singledispatch有助于定义单次分派(dispatch)泛型方法。同时,有 super()用于调用方法或访问父类(super class)的属性。 是否有类似super(
使用python3.4。在这里我想使用 singledispatch 在 __mul__ 方法中分派(dispatch)不同的类型。像这样的代码: class Vector(object):
我正在重构一个将各种日期格式(即 ISO 8601 字符串、 datetime.date 、 datetime.datetime 等)转换为 Unix 时间戳的函数。 我希望新函数使用 @single
背景 假设我要实现一个简单的装饰器 @notifyme在调用装饰函数时打印一条消息。我希望装饰器接受一个参数来打印自定义消息;参数 (以及围绕参数的括号)可以省略,在这种情况下打印默认消息: @not
我安装 tornado 后,在测试一个实例时,它显示错误 no module named singledispatch。 但是当我导入 tornado 时就没问题了。 需要帮助。 最佳答案 不知何故你
我正在过渡到 Python3,并且一直在探索 stdlib 的一些功能。 functools.singledispatch引起了我的注意,我一直在玩弄它。但是,当我尝试在类里面使用它时遇到了一些问题。
我是一名优秀的程序员,十分优秀!