bool()和operator.truth()之间有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bool()和operator.truth()之间有什么区别?相关的知识,希望对你有一定的参考价值。
bool()
和operator.truth()
都测试一个值是真实的还是虚假的,它们看起来与文档相似,它甚至在truth()
文档中说:
这相当于使用bool构造函数。
然而,truth()
的速度是bool()
的两倍,来自一个简单的测试(Python 3.6时序显示,但2.7相似):
from timeit import timeit
print(timeit('bool(1)', number=10000000))
# 2.180289956042543
print(timeit('truth(1)', setup='from operator import truth', number=10000000))
# 0.7202018899843097
那有什么区别?我应该使用truth()
而不是bool()
吗?
在ShadowRanger根据this question进行广泛评论和讨论后,本次问答出现了。
尽管bool()
和operator.truth()
在主要用例中输出相同的结果,但它们的实现实际上是相当不同的。 bool()
是类或类型构造函数,而truth()
是一个窄优化的常规函数。
实际上,还存在两个不同之处:1)bool()
在没有参数的情况下调用return
s False
而truth()
需要参数。 2)bool()
接受x
关键字参数,如bool(x=1)
,而truth()
不接受关键字参数。对于常规用例,这两个都增加了bool()
的开销。
关键词实现是奇怪的,因为可能没有人需要它,名称x
几乎不具描述性。 Issue29695涵盖了这一点,事实上这个问题不仅影响bool()
,还影响其他类别,如int()
或list()
。但是,从Python 3.7开始,这些关键字参数将被删除,速度应该提高。尽管如此,我在最新的Python 3.8分支上测试了时间,而bool()
比以前更快,但仍然比truth()
慢两倍,可能是由于bool()
的更通用的实现。
所以,如果你有一个速度非常重要的任务,我建议你使用truth()
而不是bool()
,如果你需要一个函数(例如解析为sorted()
的关键字)。然而,正如khelwood指出的那样,bool()
偶尔会更快,例如filter(bool, iterable)
,所以最好用你的用例来确定最好的选择。
当然,如果你不需要一个函数并且只是想测试一个值是真或假,你应该使用惯用的if
或if not
语句,这些语句最快,如khelwood和user2357112评论。
在ShadowRanger根据this question进行广泛评论和讨论后,本次问答出现了。
以上是关于bool()和operator.truth()之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C 中的 bool、Boolean 和 BOOL 之间有啥区别吗?
标准的 atomic bool 和 atomic flag 之间的区别