比较列表推导式和显式循环(3 个数组生成器比 1 个 for 循环快)

2024-04-13

我做了作业,无意中发现算法的速度出现了奇怪的不一致。 这是相同函数的代码的 2 个版本,但有 1 个区别:在第一个版本中,我使用 3 次数组生成器来过滤某些数组,在第二个版本中,我使用 1 个 for 循环和 3 个 if 语句来执行相同的过滤工作。

所以,这是第一个版本的代码:

def kth_order_statistic(array, k):
    pivot = (array[0] + array[len(array) - 1]) // 2
    l = [x for x in array if x < pivot]
    m = [x for x in array if x == pivot]
    r = [x for x in array if x > pivot]
    if k <= len(l):
            return kth_order_statistic(l, k)
    elif k > len(l) + len(m):
            return kth_order_statistic(r, k - len(l) - len(m))
    else:
            return m[0]

这里是第二个版本的代码:

def kth_order_statistic2(array, k):
    pivot = (array[0] + array[len(array) - 1]) // 2
    l = []
    m = []
    r = []
    for x in array:
        if x < pivot:
            l.append(x)
        elif x > pivot:
            r.append(x)
        else:
            m.append(x)

    if k <= len(l):
        return kth_order_statistic2(l, k)
    elif k > len(l) + len(m):
        return kth_order_statistic2(r, k - len(l) - len(m))
    else:
        return m[0]

第一个版本的 IPython 输出:

In [4]: %%timeit
   ...: A = range(100000)
   ...: shuffle(A)
   ...: k = randint(1, len(A)-1)
   ...: order_statisctic(A, k)
   ...:
10 loops, best of 3: 120 ms per loop

对于第二个版本:

In [5]: %%timeit
   ...: A = range(100000)
   ...: shuffle(A)
   ...: k = randint(1, len(A)-1)
   ...: kth_order_statistic2(A, k)
   ...:
10 loops, best of 3: 169 ms per loop

那么为什么第一个版本比第二个版本快呢?我还制作了第三个版本,使用 filter() 函数而不是数组生成器,它比第二个版本慢(每个循环 218 毫秒)


使用简单forlist comprehesion。几乎快了 2 倍。检查以下结果:

Using list comprehension: 58 usec

moin@moin-pc:~$ python -m timeit "[i for i in range(1000)]"
10000 loops, best of 3: 58 usec per loop

Using for loop: 37.1 微秒

moin@moin-pc:~$ python -m timeit "for i in range(1000): i"
10000 loops, best of 3: 37.1 usec per loop

但就你而言,for比列表理解花费更多时间并不是因为您的 for 循环很慢。但因为.append()您在代码中使用。

With append() in for loop`: 114 usec

moin@moin-pc:~$ python -m timeit "my_list = []" "for i in range(1000): my_list.append(i)"
10000 loops, best of 3: 114 usec per loop

这清楚地表明它是.append()这花费了两倍的时间for loop.

然而,关于storing the "list.append" in different variable: 69.3 微秒

moin@moin-pc:~$ python -m timeit "my_list = []; append = my_list.append" "for i in range(1000): append(i)"
10000 loops, best of 3: 69.3 usec per loop

上面的比较中,与最后一种情况相比,性能有了很大的提高,结果与list comprehension。这意味着,而不是调用my_list.append()每次,可以通过将函数的引用存储在另一个变量中来提高性能,即append_func = my_list.append并使用该变量进行调用append_func(i).

这也证明了,与直接使用类的对象进行函数调用相比,调用存储在变量中的类的函数更快.

谢谢Stefan https://stackoverflow.com/users/1672429/stefan-pochmann引起注意的最后一个案件。

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

比较列表推导式和显式循环(3 个数组生成器比 1 个 for 循环快) 的相关文章

  • matplotlib 中的 R 风格数据轴缓冲区

    R 绘图自动设置 x 和 y 限制 以在数据和轴之间留出一些空间 我想知道 matplotlib 是否有办法自动执行相同的操作 如果没有 是否有一个好的公式或 经验法则 来说明 R 如何设置其轴限制 在 matplotlib 中 您可以通过
  • Tipfy:如何在模板中显示blob?

    鉴于在 gae 上使用tipfy http www tipfy org python 以下模型 greeting avatar db Blob avatar 显示 blob 此处为图像 的模板标签是什么 在这种情况下 斑点是一个图像 这很棒
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • numpy:大量线段/点的快速规则间隔平均值

    我沿着一维线有许多 约 100 万个 不规则间隔的点 P 这些标记线段 这样 如果点是 0 x a x b x c x d 则线段从 0 gt x a x a gt x b x b gt x c x c gt x d 等 我还有每个段的 y
  • 如何在Python代码中查找列号

    简短问题 当按上述方式调用函数时 我可以找到行号here https stackoverflow com questions 3056048 filename and line number of python script 同样 如何找到
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • 返回上个月的日期时间对象

    如果 timedelta 在它的构造函数中有一个月份参数就好了 那么最简单的方法是什么 EDIT 正如下面指出的那样 我并没有认真考虑这一点 我真正想要的是上个月的任何一天 因为最终我只会获取年份和月份 因此 给定一个日期时间对象 返回的最
  • 如何将类添加到 LinkML 中的 SchemaDefinition?

    中的图表https linkml io linkml model docs SchemaDefinition https linkml io linkml model docs SchemaDefinition and https link
  • 根据第三个变量更改散点图中的标记样式

    我正在处理多列字典 我想绘制两列 然后根据第三列和第四列更改标记的颜色和样式 我很难改变 pylab 散点图中的标记样式 我的方法适用于颜色 不幸的是不适用于标记样式 x 1 2 3 4 5 6 y 1 3 4 5 6 7 m k l l
  • Jupyter Notebook 中的深色模式绘图 - Python

    我正在使用 Jupyter Notebook 目前正在使用 JupyterThemes 的深色日光主题 我注意到我的绘图不是处于黑暗模式 并且文本仍然是黑色并且在日光照射的背景上无法读取 JupyterThemes 的自述文件建议在 ipy
  • 如何使用 django-pyodbc (ubuntu 16.04) 配置数据库设置 Django-MSSQL?

    我是 Django 新手 目前正在尝试使用另一个数据库来保存我的模型 即MS SQL 我的数据库部署在docker容器中 903876e64b67 microsoft mssql server linux bin sh c opt mssq
  • 线性同余生成器 - 如何选择种子和统计检验

    我需要做一个线性同余生成器 它将成功通过所选的统计测试 我的问题是 如何正确选择发电机的数字以及 我应该选择哪些统计检验 我想 均匀性的卡方频率测试 每代收集10 000个号码的方法 将 0 1 细分为10个相等的细分 柯尔莫哥洛夫 斯米尔
  • Django Rest Framework POST 更新(如果存在或创建)

    我是 DRF 的新手 我阅读了 API 文档 也许这是显而易见的 但我找不到一个方便的方法来做到这一点 我有一个Answer与 a 具有一对一关系的对象Question 在前端 我曾经使用 POST 方法来创建发送到的答案api answe
  • 在 matplotlib 中绘制多边形的并集[重复]

    这个问题在这里已经有答案了 我正在尝试绘制几个多边形的并集matplotlib 具有一定的 alpha 水平 我当前的代码在交叉点处颜色较深 有没有办法让交叉路口与其他地方的颜色相同 import matplotlib pyplot as
  • Python 导入非常慢 - Anaconda python 2.7

    我的 python import 语句变得非常慢 我使用 Anaconda 包在本地运行 python 2 7 导入模块后 我编写的代码运行得非常快 似乎只是导入需要很长时间 例如 我使用以下代码运行了一个 tester py 文件 imp
  • 来自索引范围 Swift 的新数组

    我怎样才能做这样的事情 从数组中取出前 n 个元素 newNumbers numbers 0 n 目前出现以下错误 error could not find an overload for subscript that accepts th
  • 更新 SQLAlchemy 中的特定行

    我将 SQLAlchemy 与 python 一起使用 我想更新表中等于此查询的特定行 UPDATE User SET name user WHERE id 3 我通过 sql alchemy 编写了这段代码 但它不起作用 session
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • 如何使用 Python 3 正确显示倒计时日期

    我正在尝试获取将显示的倒计时 基本上就像一个世界末日时钟哈哈 有人可以帮忙吗 import os import sys import time import datetime def timer endTime datetime datet
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new

随机推荐

  • 如何使 cassandra 中的值独一无二

    我想在 cassandra 中进行唯一约束 因为我希望我的专栏中的所有值在我的专栏系列中都是唯一的 前任 名字 拉胡尔 电话123 地址 abc 现在我希望我这一行没有等于 rahul 123 和 abc 的值在 datastax 上搜索时
  • 如何使用地理编码器计算两点之间的距离(以公里为单位)

    我正在尝试找出一种使用地理编码器显示地图上两点之间的计算距离的方法 我的表中有 start address 和 destination address 在我看来是我要求的 我的模型如下所示 class Ride lt ActiveRecor
  • 为什么 java.util.Properties 实现 Map 而不是 Map

    The java util Properties类旨在表示一个映射 其中键和值都是字符串 这是因为Properties对象用于读取 properties文件 它们是文本文件 那么 为什么在Java 5中他们要改造这个类来实现Map
  • Istio 目标规则子集不起作用

    我的 istio 目标规则不起作用 在 kiali 中出现以下错误 VirtualService and destination rule for echo service 我的召唤echo svc 8080 and echo svc 80
  • 如何使用 querySelector on 按名称选择输入元素?

    我最近在该网站上收到了有关使用的帮助querySelector在表单输入上 例如select但当我采取
  • 在 Android Studio 中注释/取消注释所选文本的键盘快捷键

    如何使用控制组合键注释掉 IDE 中选定的几行文本 I thought that Ctrl Alt C was the correct sequence but that s not working To comment uncomment
  • 如何从 javax.lang.model.VariableElement 获取参数类型

    我正在尝试使用 Java 6 元模型 API 查找方法的参数类型 如果类型是枚举 我还想知道它的所有类型的枚举常量名称 这是我到目前为止所得到的 for Element member members if member getKind El
  • 将 NSArray 写回 plist

    我有一个具有以下格式的 plist 我是这样读的 NSString errorDesc nil NSPropertyListFormat format NSString path NSBundle mainBundle pathForRes
  • 确定组件的所有者何时加载

    我创建了一个包含自定义组件的 WinForms 应用程序 该组件需要在启动时触发其事件之一 但是在调用组件的构造函数时 所有事件处理程序仍然为空 我需要的是一个事件 告诉我拥有该组件的窗口已加载并且所有事件处理程序已设置 然而 组件似乎没有
  • 从 GitHub 拉取请求获取评论列表

    根据http developer github com v3 pulls comments list comments on a pull request http developer github com v3 pulls comment
  • 泛型错误:预期类型参数,找到结构

    我开始了一个新项目 我希望尽可能模块化 我的意思是我希望将来能够用其他部件替换某些部件 这似乎是一个完美的用途traits 目前我有这个代码 mod parser mod renderer mod renderers use parser
  • 我的 Django URL 没有显示破折号

    我正在尝试找出一个与domain com about us 和domain com home 匹配的网址 我有一个网址正则表达式 P
  • JavaScript 无法在脚本标签中工作? [复制]

    这个问题在这里已经有答案了 我需要知道为什么要这样做 因为我在网站的脚本标签中使用了 javascript 但它不起作用 为什么我的javascript在脚本标签中不起作用 切换不会切换 http jsfiddle net J7L4k 2
  • 如何获取 asp.net c# 的发布数据[重复]

    这个问题在这里已经有答案了
  • WiX 在构建服务器上失败

    我有一个使用 WiX 的项目 它在我的本地计算机上运行良好 但是当我发布到构建服务器时 构建会因以下内容而崩溃 来自 MSBuild 日志 Using HeatDirectory task from assembly C Program F
  • 为什么标准没有提供擦除删除惯用语的便利帮助程序?

    从 STL 中的集合中删除项目需要一种经常使用的技术 该技术已成为一种习惯用法 擦除 删除 惯用语 https en wikipedia org wiki Erase E2 80 93remove idiom 这个习语最常见的用法之一是删除
  • 如何找出当前页面上的光标位置?

    我向页面添加了一堆内容 例如document add p 然后我使用文档添加一个填充两列的表格here http itextpdf com examples iia php id 91 在这个过程中 我使用 column setSimple
  • retrbinary 期间线程化“NOOP”命令

    我编写了一个 FTP 脚本 遗憾的是该脚本必须处理位于防火墙后面的服务器 ISP 也会很早就切断我的控制连接 无论我在防火墙的任一侧设置什么样的超时设置 我最终做出了两个选择 1 在 retrbinary 命令中分叉代码 以便下载完成时每
  • Python 中的标量场可视化

    我需要在 Python 中可视化几个重叠的标量场 我发现mayavi图书馆做这种情节 问题是我不明白如何为标量字段自定义颜色图 我的想法是为每个字段设置一种颜色的阴影 我尝试采用一个例子 http docs enthought com ma
  • 比较列表推导式和显式循环(3 个数组生成器比 1 个 for 循环快)

    我做了作业 无意中发现算法的速度出现了奇怪的不一致 这是相同函数的代码的 2 个版本 但有 1 个区别 在第一个版本中 我使用 3 次数组生成器来过滤某些数组 在第二个版本中 我使用 1 个 for 循环和 3 个 if 语句来执行相同的过