Django中的cached_property和Python的functools有什么区别?

hgb9j2n6  于 6个月前  发布在  Python
关注(0)|答案(1)|浏览(57)

Django有一个名为cached_property的装饰器,可以从django.utils.functional导入。另一方面,Python 3.8将cached_property添加到标准库中,可以从functools导入。
两者是否等同,即它们是否可以互换?或者两者之间有什么区别?是否有任何最佳实践?

qmelpv7a

qmelpv7a1#

经过一些研究,两者基本上以相同的方式工作,您会看到的唯一区别是错误处理和性能。Django的问题跟踪器上有一个ticket #30949,可以使用functools.cached_property而不是django.utils.functional.cached_property
你可以看到functools.cached_property的源代码[GitHub]和django的版本[GitHub]。基本的区别是functool的版本做了更多的错误处理,主要的区别是functool(Python 3.12之前)使用锁定机制来保证线程安全,这导致了与Django版本相比的性能下降。从上面链接的ticket中进行的一些基准测试来看,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的bug跟踪器上也有一个关于这个的issue 43468。请注意,这种锁定行为在Python 3.12版本中被删除,现在性能应该基本相似。
总而言之,如果你使用的是Python 3.12+,首选functools版本,否则使用Django的版本,如果线程安全不是问题,否则你可能想使用functools版本。

相关问题