bool()和operator.truth()之间有什么区别?
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()
吗?
-
虽然
bool()
并operator.truth()
输出 为主要用途的情况下相同的结果他们的 实现
实际上是相当不同的。bool()
是一个类或类型的构造函数,同时truth()
是一个狭窄的优化正则函数。实际上,还有两个区别:1)
bool()
在不带参数的情况下调用return
s
False
whiletruth()
需要一个参数。2)bool()
接受x
关键字参数,例如bool(x=1)
,而truth()
没有关键字参数。bool()
对于常规用例,这两者都会增加开销。关键字的实现很奇怪,因为可能没有人需要它,而且名称
x
几乎没有描述性。Issue29695涵盖了这一点,实际上,该问题不仅影响到bool()
其他类,例如int()
或list()
。但是,从Python
3.7开始,这些关键字参数将被删除,并且速度应会提高。尽管如此,我还是在最新的Python
3.8分支上测试了时序,并且bool()
比以前更快,但仍比以前快两倍truth()
,这可能是由于的实现更为通用bool()
。因此,如果您的任务非常重视速度,那么我建议您在需要函数的情况下使用
truth()
over
bool()
(例如,解析为的键sorted()
)。但是,正如khelwood所指出的那样,bool()
有时还是会更快filter(bool, iterable)
,所以最好将您的用例确定为最佳选择。当然,如果您不需要功能,而只想测试值是 真 还是 假 ,则应使用惯用语
if
或if not
语句,如khelwood和ser2357112所评论的那样,这是最快的。