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.
答案 0 :(得分:11)
虽然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)
,因此最好将您的用例计时以确定最佳选项。
当然,如果您不需要某个功能而只是想测试某个值是 truthy 还是 falsy ,那么您应该使用惯用语if
或if not
语句,这些语句以khelwood和user2357112评论最快。
在ShadowRanger下与this question进行广泛的评论和讨论之后,就出现了这个Q& A.