python - Django 中的 cached_property 与 Python 的 functools 有什么区别?

标签 python django python-3.8 python-3.9

Django 有一个装饰器叫 cached_property 可以从 django.utils.functional 导入.另一方面,Python 3.8 添加了 cached_property 到可以从 functools 导入的标准库.
两者是否等效,即它们是否可以互换?或者两者有什么区别?何时使用一种或另一种有最佳实践吗?

最佳答案

经过一些研究,两者的工作方式基本相同,您会看到的唯一区别在于错误处理和性能。有一个ticket #30949在 Django 的问题跟踪器上使用 functools.cached_property而不是 django.utils.functional.cached_property .
您可以看到 source code [GitHub]functools.cached_property也适用于 django's version [GitHub] .基本的区别是 functool 的版本做了更多的错误处理,主要区别在于 functool 使用锁定机制来保证线程安全,这与 Django 的版本相比会导致性能下降。来自一些 benchmarking在上面链接的票证中完成似乎Django的版本在性能方面效率更高:

% python benchmark.py
.....................
Django Cache: Mean +- std dev: 12.8 ms +- 0.2 ms
.....................
Python Cache: Mean +- std dev: 113 ms +- 2 ms

还有一个issue 43468关于 Python 的错误跟踪器。
总之,如果线程安全不是问题,请使用 Django 的版本,否则您可能想要使用 functools 版本。

关于python - Django 中的 cached_property 与 Python 的 functools 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68593165/

相关文章:

python - 基于文本的游戏 Kivy-文本不更新

django - 来自路由器 IP 的无效 HOST header

python - 当我使用 pygame.sprite.spritecollide() 时,为什么只有子弹消失了?

python - Docker如何将python 3.8设为默认

python - Pygame角色移动方向

python - 我们可以编辑endpoints.py并在airflow中添加新功能吗?

python - Flask-Markdown/Flask-Misaka 过滤器将 Markdown 封装在 pre 标签中

python - Django 找不到任何 View ,但索引

python - 向 pandas 数据框添加新列以指示特定列中的重复项

javascript - 如何使用 jquery 在 Django 中提供图像