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/