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()在没有参数的情况下调用returns Falsetruth()需要参数。 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),所以最好用你的用例来确定最好的选择。

当然,如果你不需要一个函数并且只是想测试一个值是真或假,你应该使用惯用的ifif not语句,这些语句最快,如khelwood和user2357112评论。

ShadowRanger根据this question进行广泛评论和讨论后,本次问答出现了。

以上是关于bool()和operator.truth()之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 中的 bool、Boolean 和 BOOL 之间有啥区别吗?

标准的 atomic bool 和 atomic flag 之间的区别

bool / Boolean,string / String等之间的区别[重复]

数据类型之间的转换

Qt中字符串和数值之间的转换

提供 undetermined-lifespan bool 在线程之间共享的最简单方法是啥?