Django中的cached_property与Python的functools之间有什么区别?

20

Django有一个名为cached_property的装饰器,可从django.utils.functional导入。另一方面,Python 3.8在标准库中添加了cached_property,可以从functools导入。

这两者是否等效,即它们是否可互换?还是它们之间有什么区别?在何时使用其中之一是否存在最佳实践?

1个回答

16
经过一些研究,两者基本上以相同的方式工作,唯一的区别在于错误处理和性能。Django的问题跟踪器上有一个ticket #30949,建议使用functools.cached_property代替django.utils.functional.cached_property
您可以查看functools.cached_property源代码[GitHub],也可以查看Django版本[GitHub]的源代码。基本区别是functool的版本进行了更多的错误处理,主要区别在于functool使用锁定机制来实现线程安全,这会导致性能降低,而Django的版本则更加高效。从上面链接的票据中进行的一些基准测试表明,Django的版本在性能方面更加优秀。
% python benchmark.py
.....................
Django Cache: Mean +- std dev: 12.8 ms +- 0.2 ms
.....................
Python Cache: Mean +- std dev: 113 ms +- 2 ms

关于这个问题,Python的漏洞跟踪器上也有一个issue 43468

总之,如果线程安全不是问题,使用Django的版本;否则,您可能需要使用functools版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接