bool()和operator.truth()之间有什么区别?

时间:2018-02-27 13:30:38

标签: python python-3.x python-2.7 performance boolean

bool()operator.truth()都会测试某个值是 truthy 还是 falsy ,它们看起来与文档非常相似,甚至可以说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进行广泛的评论和讨论之后,就出现了这个Q& A.

1 个答案:

答案 0 :(得分:11)

虽然bool()operator.truth() 输出主要用例的结果相同,但实现实际上是相当不同的。 bool()是类或类型构造函数,而truth()是一个窄优化的常规函数​​。

实际上,还有两个不同之处:1)bool()调用没有参数return s 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),因此最好将您的用例计时以确定最佳选项。

当然,如果您不需要某个功能而只是想测试某个值是 truthy 还是 falsy ,那么您应该使用惯用语ifif not语句,这些语句以khelwood和user2357112评论最快。

ShadowRanger下与this question进行广泛的评论和讨论之后,就出现了这个Q& A.