当前位置: 首页 > 面试题库 >

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

方嘉言
2023-03-14
问题内容

bool()operator.truth()两个测试值是否
truthyfalsy ,他们似乎从文档颇为相似,它甚至说,在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()在不带参数的情况下调用returns
Falsewhiletruth()需要一个参数。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),所以最好将您的用例确定为最佳选择。

当然,如果您不需要功能,而只想测试值是 还是 ,则应使用惯用语ifif not语句,如khelwood和ser2357112所评论的那样,这是最快的。



 类似资料:
  • 我有两个问题。 > 当bool()方法调用时,Python中的任何东西(对象、类型、操作、函数...)都可以返回布尔值吗? 为什么下面两行代码不返回相同的答案?

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 今天,我按照一些说明在Linux中安装软件。有一个脚本需要首先运行。它设置一些环境变量。 指令告诉我要执行,但是我执行错误了。因此未设置环境。最后,我注意到了这一点并继续进行。 我想知道这两种调用脚本方法的区别。我对Linux完全陌生,所以请尽可能详细。 问题答案: 运行脚本,将启动一个新的运行脚本的外壳。新的外壳程序不会影响启动脚本的父外壳程序。 是的简写形式,它将在当前shell中

  • 问题内容: 我刚开始使用Spring。我遇到了很多教程。我看到使用更多的例子比。我查看了Spring文档,但无法弄清楚使用其中一个的好处。有人可以提供一些解释吗? 问题答案: 是的便捷子类。 JavaDoc描述了一些添加的属性,这些属性在某些情况下可能有用: UrlBasedViewResolver的便利子类,它支持InternalResourceView(即Servlet和JSP)以及诸如Jst

  • 问题内容: 我刚刚看到了包含标签的CSS代码。我看着MDN看看是什么,但我真的不明白。 有人可以解释它是如何工作的吗? 它会在我们通过CSS选择之前创建DOM元素吗? 问题答案: 根据这些文档,它们是等效的: 唯一的区别是CSS3中使用了双冒号,而单冒号是旧版本。 推理: CSS 3中引入了:: before表示法,以便在伪类和伪元素之间建立区别。浏览器还接受:在CSS 2中引入的表示法。

  • 问题内容: 以下哪个更好? 要么 我知道的唯一区别是,当“ a”为null时,第一个返回false,而第二个抛出异常。除此之外,它们是否总是给出相同的结果? 问题答案: 使用时,你需要B在编译时知道类。使用时可以是动态的,并且可以在运行时更改。