为什么Python列表排序后速度变慢?

2024-01-11

在下面的代码中,我创建了两个具有相同值的列表:一个列表未排序 (s_not),另一个列表已排序 (s_yes)。这些值由 randint() 创建。我为每个列表运行一些循环并计时。

import random
import time

for x in range(1,9):

    r = 10**x # do different val for the bound in randint()
    m = int(r/2)

    print("For rand", r)

    # s_not is non sorted list
    s_not = [random.randint(1,r) for i in range(10**7)]

    # s_yes is sorted
    s_yes = sorted(s_not)

    # do some loop over the sorted list
    start = time.time()
    for i in s_yes:
        if i > m:
            _ = 1
        else:
            _ = 1
    end = time.time()
    print("yes", end-start)

    # do the same to the unsorted list
    start = time.time()
    for i in s_not:
        if i > m:
            _ = 1
        else:
            _ = 1
    end = time.time()
    print("not", end-start)

    print()

带输出:

For rand 10
yes 1.0437555313110352
not 1.1074268817901611

For rand 100
yes 1.0802974700927734
not 1.1524150371551514

For rand 1000
yes 2.5082249641418457
not 1.129960298538208

For rand 10000
yes 3.145440101623535
not 1.1366300582885742

For rand 100000
yes 3.313387393951416
not 1.1393756866455078

For rand 1000000
yes 3.3180911540985107
not 1.1336982250213623

For rand 10000000
yes 3.3231537342071533
not 1.13503098487854

For rand 100000000
yes 3.311596393585205
not 1.1345293521881104

因此,当增加 randint() 中的界限时,排序列表上的循环会变慢。为什么?


缓存未命中。什么时候Nint 对象是连续分配的,保留用于保存它们的内存往往位于连续的块中。因此,按分配顺序爬行列表往往也会访问按顺序、连续、递增顺序保存 int 值的内存。

将其打乱,并且在列表上爬行时的访问模式也是随机的。缓存未命中的情况比比皆是,只要有足够多的不同 int 对象,而它们并不全部适合缓存。

At r==1, and r==2,CPython 碰巧将如此小的整数视为单例,因此,例如,尽管列表中有 1000 万个元素,但在r==2它仅包含(最多)100 个不同的 int 对象。这些数据的所有数据同时放入缓存中。

但除此之外,您可能会获得越来越多、越来越不同的 int 对象。当访问模式是随机的时,硬件缓存变得越来越无用。

说明:

>>> from random import randint, seed
>>> seed(987987987)
>>> for x in range(1, 9):
...     r = 10 ** x
...     js = [randint(1, r) for _ in range(10_000_000)]
...     unique = set(map(id, js))
...     print(f"{r:12,} {len(unique):12,}")
...     
          10           10
         100          100
       1,000    7,440,909
      10,000    9,744,400
     100,000    9,974,838
   1,000,000    9,997,739
  10,000,000    9,999,908
 100,000,000    9,999,998
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Python列表排序后速度变慢? 的相关文章

随机推荐

  • 将消息从内容脚本发送到另一个脚本

    我正在开发一个 Google Chrome 扩展 我的目的是将消息从 script1 js 发送到 script2 js 这是我在manifest json中写的内容 matches https www google fr css styl
  • 响应式设计和图像尺寸

    问 就图像加载时间和性能而言 哪种技术最有效 场景1 是否通过使用媒体查询来加载不同尺寸的图像 如下 Smartphone media screen and max width 320px img page 1 img background
  • Android 版 facebook connect 返回空白登录屏幕?

    我正在尝试使用旧的 facebook 连接身份验证来验证我的 android 客户端 以获得开始使用 facebook 的网络服务所需的必要会话 ID 和其他凭据 我遇到的问题是 当我的 Android 应用程序启动并尝试加载 facebo
  • 防止 UIWebView 内出现烦人的 HTML5 地理位置警报

    每当脚本请求地理位置时 使用HTML5的地理定位 API UIWebView请求使用 iOS 定位服务的权限 这非常烦人 特别是当您加载静态时HTML文件时 它会不断询问每个文件的权限 即使用户已经为应用程序本身授予了此权限 有办法预防吗
  • Datatable:日期/时间排序插件未排序

    我有一个基本的 Spring Boot 应用程序 嵌入式 Tomcat Thymeleaf 模板引擎 我想订购数据表的 1 个日期列 在我的 POJO 中 public String getTimeFormatted DateTimeFor
  • ContentResolver.query() 方法抛出“无效令牌限制”错误

    内部版本号为 RQ1A 201205 003 或更高版本的 Pixel 设备上会出现以下错误 我想知道错误的原因以及如何处理 这是错误还是规格更改 code ContentResolver resolver getContentResolv
  • Visual Studio C++ Link1104无法打开文件MSVCURTD.lib

    我已经在 Visual Studio 2017 社区中打开了一个用 Visual Studio 2012 Express 用 C 编写 制作的项目 当我尝试编译时出现以下错误 LINK1104 无法打开文件 MSVCURTD lib 如果我
  • 重播 GIF 动画/单击时重新加载 GIF

    我有一个很大的 GIF 动画 我让它显示一个加载图标 直到 GIF 加载完毕 加载后就会显示 GIF 效果很好 但我想添加一个 重播 按钮来触发 GIF 重播 重新加载 加载和GIF的代码 HTML div class loading im
  • Linq to Entities 删除

    是否有内置方法可以使用主键通过 Linq to Entities 进行删除 目前的解决方法是创建一个名为DeleteTable的存储过程 表是表名 然后在 C LINQ To Entities 中我只需执行 context DeleteTa
  • 如何在 Appveyor 构建之前运行 VCUpgrade?

    我们分发了一组 Visual Studio 2010 项目文件 用户应该根据自己的口味进行升级 我们的 appveyor yml file http github com weidai11 cryptopp blob master appv
  • R Shiny with Leaflet - 单击后更改标记的颜色

    我正在开发一个闪亮的应用程序 它显示带有标记的传单地图 标记是可点击的 我收集被点击标记的 ID 但我还想更改单击标记的颜色 当标记为蓝色时 它应更改为红色标记 反之亦然 到目前为止 我已经有了跟踪单击的标记的代码 并且可以将 ID 存储在
  • 什么会导致 %5B0%5D 添加到 url

    我试图找出为什么删除过滤器的链接在我的网站上不起作用 似乎是因为链接已更改为包含 5B0 5D 和其他各种字母和数字 并添加了 据我所知 这是序列化函数导致的 还有其他什么可能导致这种情况 或者它绝对是序列化函数吗 它被称为百分比编码 ht
  • 在 netbeans 中运行 Web 应用程序

    我正在使用 netbeans 和 apache tomcat 来运行 Web 应用程序 我不断收到此错误 In place deployment at C WorkingDirectory Projects GreenWheelsProje
  • 从 iTunes Connect 中删除新的应用程序版本

    我在 iTunes Connect 中使用错误的版本号创建了应用程序的新版本 我想删除处于 准备上传 状态的新版本 我该怎么做呢 关于此还有其他问题 但他们没有提供任何答案 适用于已上传二进制文件的版本 或者已过时 我就此向 Apple 提
  • 在 C++ 中提供指针恒定视图的更好方法

    我有一个类必须返回一个constant一些指向软件上层的指针的视图 在内部 指针必须是非常量 因为类需要在内部操作对象 我没有看到任何选项可以在不复制所有指针的情况下向更高级别的客户端提供指针的常量视图 这看起来很浪费 如果我管理数百万个对
  • 如何连接到 TT X_TRADER API 以使用 python 创建自动交易系统?

    我已经在内部开发论坛中多次看到这个问题 因此想提供一个快速示例 说明如何立即在 python 中实现这一点 首先 请注意 我们所做的只是连接到相关的 X TRADER com 对象 因此以下所有内容仍然适用 https www tradin
  • 如何将复选框与文本对齐到屏幕右侧?

    我里面有一个复选框TableRow 我想将复选框和文本对齐到屏幕的右侧 但是当我使用android gravity right 它仅将文本与屏幕右侧对齐 但不与正方形 复选框本身 对齐 它们似乎是单独对齐的 复选框位于屏幕的左侧 文本位于屏
  • 具有不同函数原型的函数查找表

    除了一系列之外 根据用户输入调用指定函数的最佳方法是什么 if and strcmp 例如 p 2 2 gt call func p 2 2 a 8 gt call func a 7 m gt call func m void 我知道制作一
  • 使用 javascript 或 jQuery 隐藏所有带有与数字“0”或自定义值匹配的文本或innerHTML的“a”元素

    我需要隐藏全部 a 带有文本或的元素innerHTML匹配数字 foo 或使用 javascript 或 jQuery 的自定义值 li a href class dir foo a li 我努力了 jQuery document read
  • 为什么Python列表排序后速度变慢?

    在下面的代码中 我创建了两个具有相同值的列表 一个列表未排序 s not 另一个列表已排序 s yes 这些值由 randint 创建 我为每个列表运行一些循环并计时 import random import time for x in r