python中not not x 与bool(x) 的区别

他们都可以把 x 变成一个布尔类型的值:

>>> x = 123
>>> not not x
True
>>> bool(x)
True
>>>

那么谁更快呢?我们写段代码,跑个 100 万次,来比较下谁更快:

import timeit

def bool_convert(x):
    return bool(x)

def notnot_convert(x):
    return not not x

def main():
    trials = 10_000_000
    kwargs = {
        "setup": "x=42",
        "globals": globals(),
        "number": trials,
    }

    notnot_time = timeit.timeit("notnot_convert(x)", **kwargs)
    bool_time = timeit.timeit("bool_convert(x)", **kwargs)

    print(f"{bool_time = :.04f}")
    print(f"{notnot_time = :.04f}")

if __name__ == "__main__":
    main()

运行结果如下:

其实 bool(x) 慢的原因在于它是一个函数调用,而 not not x 就是一条指令,具有更快捷的转换为布尔值的路径,这一点可以从字节码可以看出来:

bool(x) 多了 LOAD_GLOBAL CALL_FUNCTION

这里附一下相关字节码的官方说明:

LOAD_GLOBAL(namei)
Loads the global named co_names[namei] onto the stack.

CALL_FUNCTION(argc)
Calls a callable object with positional arguments. argc indicates the number of positional arguments. The top of the stack contains positional arguments, with the right-most argument on top. Below the arguments is a callable object to call. CALL_FUNCTION pops all arguments and the callable object off the stack, calls the callable object with those arguments, and pushes the return value returned by the callable object.

UNARY_NOT
Implements TOS = not TOS.

最后:

从结果来看,not not x 比 bool(x) 更快,主要原因在于 bool(x) 是一个函数调用,函数调用需要参数压入栈顶,堆栈的顶部包含位置参数,最右边的参数在顶部,参数下面是要调用的可调用对象。CALL_FUNCTION 从堆栈中弹出所有参数和可调用对象,使用这些参数调用可调用对象,并推送可调用对象返回的返回值,这一过程比一个 not 指令要慢得多。

不过我仍然推荐你使用 bool(x) ,因为它的可读性更高,而且,我们也不太可能调用它 100万次。

到此这篇关于pythonnot not x 与 bool(x) 的区别的文章就介绍到这了,更多相关not not x与bool(x) 的区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python中not not x 与bool(x) 的区别

    他们都可以把 x 变成一个布尔类型的值: >>> x = 123 >>> not not x True >>> bool(x) True >>> 那么谁更快呢?我们写段代码,跑个 100 万次,来比较下谁更快: import timeit def bool_convert(x): return bool(x) def notnot_convert(x): return not not x def main(): trials = 10

  • 浅谈python中np.array的shape( ,)与( ,1)的区别

    如下所示: >>> import numpy as np >>> x = np.array([1, 2]) >>> y = np.array([[1],[2]]) >>> z = np.array([[1,2]]) >>> print(x.shape) (2,) >>> print(y.shape) (2, 1) >>> print(z.shape) (1, 2) x[1,2]的s

  • 对python中 math模块下 atan 和 atan2的区别详解

    atan 和 atan2 都是反正切函数,返回的都是弧度 对于两点形成的直线,两点分别是 point(x1,y1) 和 point(x2,y2),其斜率对应角度的计算方法可以是: angle = atan( (y2-y1)/(x2-x1) ) 或 angle = atan2( y2-y1, x2-x1 ) 因此可以看出 atan 和 atan2 的区别: 1.参数的个数不同:atan 为单个参数,atan2为两个参数 2.atan2 的优点在于: 如果 x2-x1等于0 ,角度依然可以计算,但是

  • python中urllib.request和requests的使用及区别详解

    urllib.request 我们都知道,urlopen()方法能发起最基本对的请求发起,但仅仅这些在我们的实际应用中一般都是不够的,可能我们需要加入headers之类的参数,那需要用功能更为强大的Request类来构建了 在不需要任何其他参数配置的时候,可直接通过urlopen()方法来发起一个简单的web请求 发起一个简单的请求 import urllib.request url='https://www.douban.com' webPage=urllib.request.urlopen(

  • Python中的None与 NULL(即空字符)的区别详解

    1.首先要了解Python的对象的概念: Python中,万物皆对象,所有的操作都是针对对象的,那什么是对象,5是一个int对象,'oblong'是一个str对象,异常也是一个对象,抽象一点是,人,猫,够也是一个对象 那对于一个对象,它就有包括两方面的特征:  属性:去描述它的特征  方法: 它所具有的行为 所以,对象=属性+方法 (其实方法也是一种属性,一种区别于数据属性的可调用属性 把具有相同属性和方法的对象就可以归为一类,即Classl.类就好比是一张蓝图,使用一个类可以创建多个对象实例

  • Python中json.load()和json.loads()有哪些区别

    一.图解 json.loads():解析一个有效的JSON字符串并将其转换为Python字典 json.load():从一个文件读取JSON类型的数据,然后转转换成Python字典 二.json.loads()用法 1.例子 import json data = { "name": "Satyam kumar", "place": "patna", "skills": [ "Raspberry p

  • Python中 whl包、tar.gz包的区别详解

    目录 1.whl包 2 安装 .whl库包文件 3 tar.gz包 1.whl包 whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件.使得可以在不具备编译环境的情况下,选择适合自己的python环境进行安装. 一般whl包的命名都很长,我们看下具体的含义,举个栗子: rknn_toolkit-1.7.1-cp36-cp36m-win_amd64.whl 其中,rknn_toolkit是文件名,cp36指的是对应的python版本,cp36就是python3.6,同理,cp

  • Python中%r和%s的详解及区别

    Python中%r和%s的详解 %r用rper()方法处理对象 %s用str()方法处理对象 有些情况下,两者处理的结果是一样的,比如说处理int型对象. 例一: print "I am %d years old." % 22 print "I am %s years old." % 22 print "I am %r years old." % 22 返回结果: I am 22 years old. I am 22 years old. I a

  • 浅析Python中元祖、列表和字典的区别

    1.列表(list) list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的项目应该包括在方括号中,这样Python就知道你是指明一个列表.一旦你创建了一个列表,就可以添加.删除,或者是搜索列表中的项目.由于你可以增加或者删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的,且列表是可以嵌套的. 实例: #coding=UTF-8 #author:RXS002 animalslist = ['fox','tiger','rabbit','snake']

  • Python中lambda的用法及其与def的区别解析

    python中的lambda通常是用来在python中创建匿名函数的,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python中的lambda还有如下几点和def不一样: 1. python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量. 2. python lambda它只是一个表达式,而def则是一个语句. 下面是python lambda的格式,看起来非常精简. lambda x: print x 如果你在pyt

随机推荐