bool() 和 operator.truth() 有什么区别? [英] What are the differences between bool() and operator.truth()?

查看:21
本文介绍了bool() 和 operator.truth() 有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

bool()operator.truth() 都测试一个值是 truthy 还是 falsy 并且它们从文档中看起来很相似,它甚至在 truth() 文档中说:<块引用>

这相当于使用 bool 构造函数.

然而,truth() 在简单测试中比 bool() 快两倍多(显示的是 Python 3.6 时序,但 2.7 类似):

from timeit import timeit打印(时间('布尔(1)',数字= 10000000))# 2.180289956042543print(timeit('truth(1)', setup='from operator import truth', number=10000000))# 0.7202018899843097

那么有什么区别呢?我应该使用 truth() 而不是 bool() 吗?

此问答是在与 ShadowRanger这个问题.

解决方案

虽然 bool()operator.truth() output对于主要用例的相同结果,它们的实现实际上是相当不同的.bool() 是一个类或类型构造函数,而 truth() 是一个狭义优化的正则函数.

在实际中,也有两个区别: 1) bool() 不带参数调用 returns Falsetruth() 需要一个参数.2) bool() 接受一个 x 关键字参数,比如 bool(x=1),而 truth() 不接受关键字参数.对于常规用例,这两者都会增加 bool() 的开销.

关键字 implementation 很奇怪,因为可能没有人需要它,并且名称 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这个问题.

bool() and operator.truth() both test whether a value is truthy or falsy and they seem rather similar from the docs, it even says in the truth() docs that:

This is equivalent to using the bool constructor.

However, truth() is over twice as fast as bool() from a simple test (Python 3.6 timings shown, but 2.7 is similar):

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

So what are the differences? Should I use truth() instead of bool()?

This Q&A arose after extensive comments and discussion with ShadowRanger under this question.

解决方案

Although bool() and operator.truth() output the same result for the major uses cases their implementation is actually rather different. bool() is a class or type constructor while truth() is a narrow optimised regular function.

In practical terms, there are also two differences: 1) bool() called with no arguments returns False while truth() requires an argument. 2) bool() accepts an x key word argument, like bool(x=1), while truth() takes no keyword arguments. Both of these add overhead to bool() for the regular use cases.

The key word implementation is odd since likely no-one needs it and the name x is hardly descriptive. Issue29695 covers this, and in fact the issue impacts not just bool() but other classes like int() or list(). However, from Python 3.7 onwards these key word arguments will be removed, and speed should improve. Nonetheless, I tested the timings on the latest Python 3.8 branch, and bool() is faster than before but still over twice as slow as truth(), presumably due to the more generic implementation of bool().

So, if you have a task where speed is of high importance I would recommend using truth() over bool() if you require a function (for example to parse as a key to sorted()). However, as khelwood points out, bool() can still be faster occasionally, such as filter(bool, iterable), so it is probably best to time your use case to be certain of the best option.

Of course, if you don't need a function and simply want to test if a value is truthy or falsy you should use the idiomatic if or if not statements, which are fastest as khelwood and user2357112 commented.

This Q&A arose after extensive comments and discussion with ShadowRanger under this question.

这篇关于bool() 和 operator.truth() 有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆