为什么列表理解比附加到列表快得多?

2023-12-21

我想知道为什么列表理解比附加到列表快得多。我以为差异只是表达性的,但事实并非如此。

>>> import timeit 
>>> timeit.timeit(stmt='''\
t = []
for i in range(10000):
    t.append(i)''', number=10000)
9.467898777974142

>>> timeit.timeit(stmt='t= [i for i in range(10000)]', number=10000)
4.1138417314859

列表理解速度快了 50%。为什么?


列表理解基本上只是常规的“语法糖”for环形。在这种情况下,它性能更好的原因是它不需要加载列表的追加属性并在每次迭代时将其作为函数调用。换句话说,并且一般来说,列表推导执行得更快,因为挂起和恢复函数的框架或其他情况下的多个函数比按需创建列表要慢。

考虑以下示例:

In [1]: def f1(): 
   ...:         l = [] 
   ...:         for i in range(5): 
   ...:             l.append(i) 
   ...:     
   ...:  
   ...: def f2(): 
   ...:     [i for i in range(5)] 
   ...:                                                                                                                                                                                                     

In [3]: import dis                                                                                                                                                                                          

In [4]: dis.dis(f1)                                                                                                                                                                                         
  2           0 BUILD_LIST               0
              2 STORE_FAST               0 (l)

  3           4 LOAD_GLOBAL              0 (range)
              6 LOAD_CONST               1 (5)
              8 CALL_FUNCTION            1
             10 GET_ITER
        >>   12 FOR_ITER                14 (to 28)
             14 STORE_FAST               1 (i)

  4          16 LOAD_FAST                0 (l)
             18 LOAD_METHOD              1 (append)
             20 LOAD_FAST                1 (i)
             22 CALL_METHOD              1
             24 POP_TOP
             26 JUMP_ABSOLUTE           12
        >>   28 LOAD_CONST               0 (None)
             30 RETURN_VALUE

In [5]:                                                                                                                                                                                                     

In [5]: dis.dis(f2)                                                                                                                                                                                         
  8           0 LOAD_CONST               1 (<code object <listcomp> at 0x7f397abc0d40, file "<ipython-input-1-45c11e415ee9>", line 8>)
              2 LOAD_CONST               2 ('f2.<locals>.<listcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_GLOBAL              0 (range)
              8 LOAD_CONST               3 (5)
             10 CALL_FUNCTION            1
             12 GET_ITER
             14 CALL_FUNCTION            1
             16 POP_TOP
             18 LOAD_CONST               0 (None)
             20 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x7f397abc0d40, file "<ipython-input-1-45c11e415ee9>", line 8>:
  8           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (i)
              8 LOAD_FAST                1 (i)
             10 LIST_APPEND              2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE

In [6]:   

您可以看到,在第一个函数的偏移量 18 处,我们有一个append属性,而使用列表理解的第二个函数中没有这样的东西。所有这些额外的字节码都会使附加方法变慢,因为在这种情况下,您将加载append属性在每次迭代中,最终它将使代码的速度比仅使用列表理解的第二个函数慢大约两倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么列表理解比附加到列表快得多? 的相关文章

  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • Haskell:从后面访问列表

    今天我开始学习Haskell 我对函数式语言有点陌生 而且我非常喜欢 Haskell 然而 我有一个关于它的设计的问题困扰着我 从我到目前为止的理解来看 访问列表后面的元素似乎比访问前面的元素要复杂得多 类似于xs x where xs a
  • MongoEngine 查询具有以列表中指定的前缀开头的属性的对象的列表

    我需要在 Mongo 数据库中查询具有以列表中任何前缀开头的特定属性的元素 现在我有一段这样的代码 query mymodel terms term in query terms 并且这会匹配在列表 term 上有一个项目的对象 该列表中的
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 如何将 GAE 中一种 Kind 中的所有实体复制到另一种 Kind 中,而无需显式调用每个属性

    我们如何使用function clone entity 如中所述在 Python 中复制 Google App Engine 数据存储中的实体 而无需在 编译 时知道属性名称 https stackoverflow com question
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • 如何使用 Python 3 检查目录是否包含文件

    我到处寻找这个答案但找不到 我正在尝试编写一个脚本来搜索特定的子文件夹 然后检查它是否包含任何文件 如果包含 则写出该文件夹的路径 我已经弄清楚了子文件夹搜索部分 但检查文件却难倒了我 我发现了有关如何检查文件夹是否为空的多个建议 并且我尝
  • PySpark groupByKey 返回 pyspark.resultiterable.ResultIterable

    我试图找出为什么我的 groupByKey 返回以下内容 0
  • python 中的“槽包装器”是什么?

    object dict 和其他地方的隐藏方法设置为这样的
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • python 对浮点数进行不正确的舍入

    gt gt gt a 0 3135 gt gt gt print 3f a 0 314 gt gt gt a 0 3125 gt gt gt print 3f a 0 312 gt gt gt 我期待 0 313 而不是 0 312 有没有
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • 无法使用 pip 安装任何软件包我收到此错误 ImportError: Cannot import name 'appdirs'

    当我尝试使用 pip 安装任何软件包或使用 pip 时 出现以下错误 ImportError cannot import name appdirs 一个例子 pip install tweepy Traceback most recent
  • subprocess.check_output返回码

    我在用 grepOut subprocess check output grep search tmp shell True 要运行终端命令 我知道我可以使用 try except 来捕获错误 但如何获取错误代码的值 我在官方文档中找到了这
  • 创建无公共IP地址的EMR集群

    出于安全原因 我希望创建一个 EMR 集群 其中没有为任何实例分配公共 IP 地址 我已经能够在我的 VPC 中启动集群 并使用我自己的自定义安全组 但由于某种原因 默认情况下所有节点都分配了一个公共 IP 地址 我在 EMR CLI 文档
  • org.apache.http.entity.ContentType 不再在 Apache 中了吗?

    由于某种原因 我无法导入 org apache http entity ContentType 我添加了 Apache HTTP 4 3 3 client core 公共编解码器 httpclient 缓存 公共日志记录 httpmime
  • 单击除特定 div 之外的正文

    我想做点什么 点击body 除了menutop这是里面的body div lorem ipsum div js body not menutop click function console log 323 也尝试过 var n menut
  • 如何欺骗应用程序认为其标准输出是终端,而不是管道

    我正在尝试做与 相反 的事情检测 stdin 是终端还是管道 https stackoverflow com questions 1312922 detect if stdin is a terminal or pipe in c c qt
  • 当 AsyncTasks 运行时处理屏幕方向变化

    我已经被这个困扰有一段时间了 当我有一个单独的屏幕时 如何正确处理屏幕方向的变化Thread AsyncTask跑步 目前 我有 android configChanges orientation keyboard keyboardHidd
  • Gradle def 与 ext

    使用有什么区别ext varname and def varname 例如 下面的代码似乎工作相同 task copyLicenses def outDir project buildDir absolutePath reports lic
  • jQuery Mobile 选择器菜单的代码?

    我一定错过了一些明显的东西 我正在查看 jQuery Mobile 的文档 但他们没有为您提供执行他们正在演示的操作的代码 我正在尝试创建一个选择器菜单 我在哪里可以获得此代码 它必须像一行 对吧 作为一个完全的新手 我在这里不知所措 谢谢
  • 如何使用 Windows 窗体创建自定义用户按钮/控件并将其与线条连接

    我正在尝试创建一些自定义按钮或用户控件 如建议的 GUI 中所示 功能应如下所示 图表或配置以图形方式创建 可以从工具栏拖动控件或通过鼠标右键单击 下拉菜单插入控件 通过从一个控件拖动到另一个控件 它们应该通过线连接 切换应该将视图从带有选
  • scapy.sr 和 scapy.srp 之间的差异

    我正在使用 Scapy 扫描我的网络 但看不到功能之间的差异 scapy sr and scapy srp 文档说scapy sr 返回数据包来自layer 3 and scapy srp 返回数据包来自layer 2 这些层是什么 抱歉我
  • 使用参数变量 Unity 加载场景

    在我的游戏中 有一个地图视图 其中包含 50x50 的图块网格 当你点击图块时 你会被发送到该图块视图并攻击事物等 就代码而言 这些 图块 之间的唯一区别是图块 ID 即 网格上的哪个数字 该数字将在 init 时传递给服务器来处理其余部分
  • 调用 ~Derived() 和 ~Base() 之间对象的状态

    Question C 标准对对象当时的状态有何保证 在派生类的析构函数执行之后 但在基类的析构函数执行之前 这是调用派生类的子对象的析构函数的时间 Example include
  • 尝试使用风味时 Flutter 应用程序构建失败

    我正在尝试在我的应用程序中使用风味 我遵循了各种指南 但每次都因同样的问题而无法构建 因为基本上每个博客文章和 SE 问题都引用相同的文章和资源 所以我不会再这样做了 为了调试 我决定简化问题并启动一个新项目 正常示例项目 并添加风味 每种
  • iOS 上的 OnAppearing 方法

    当我的应用程序位于后台并转到前台时 OnAppearing 方法在 IOS 中不起作用 或者当手机锁定然后解锁并且应用程序位于前台时 不会调用 OnAppearing 方法 在 Android 上一切正常 我在下面找到了这个指南 但仍然不起
  • 夜间模式颜色不适用于回收站视图背景

    我想为我的 Android 应用程序实现夜间模式 因此我使用 Theme AppCompat DayNight 主题来实现夜间模式 但我必须在夜间模式期间自定义工具栏和回收器视图的颜色 为此 我已在 attrs xml 文件中声明了该属性
  • ConnectivityManager.getBackgroundDataSetting() 已弃用,该使用什么替代?

    以前可以使用 ConnectivityManager getBackgroundDataSetting 检查用户是否有后台数据设置 true 此方法现已弃用 http developer android com reference andr
  • Selenium 中的计时页面加载时间

    我正在使用 selenium 在我的网站上记录一些性能测试 例如登录时间 查询时间等 我在 Selenium IDE 上记录了一个示例脚本 我现在让它运行一个 Selenium RC java public void testNew thr
  • Microsoft Visual Studio 2010 支持 c99 吗?

    我想知道 Microsoft Visual Studio 2010 是否支持 C99 如果没有 我如何使用标准类型 例如intptr t and uintptr t Visual Studio 2010 不支持 C99 语法 stdint
  • 为什么列表理解比附加到列表快得多?

    我想知道为什么列表理解比附加到列表快得多 我以为差异只是表达性的 但事实并非如此 gt gt gt import timeit gt gt gt timeit timeit stmt t for i in range 10000 t app