检查 python 列表/numpy ndarray 中是否存在重复项的最快方法

2023-12-27

我想确定我的列表(实际上是numpy.ndarray) 在尽可能最快的执行时间内包含重复项。请注意,我并不关心删除重复项,我只是想知道是否有重复项。

注意:如果这不是重复的,我会感到非常惊讶,但我已尽力而为却找不到。最近的是这个问题 https://stackoverflow.com/questions/89178/in-python-what-is-the-fastest-algorithm-for-removing-duplicates-from-a-list-so and 这个问题 https://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-whilst-preserving-order,两者都要求返回唯一列表。


以下是我想到的四种方法。

TL;DR:如果您期望很少(小于 1/1000)的重复项:

def contains_duplicates(X):
    return len(np.unique(X)) != len(X)

如果您期望频繁(超过 1/1000)重复:

def contains_duplicates(X):
    seen = set()
    seen_add = seen.add
    for x in X:
        if (x in seen or seen_add(x)):
            return True
    return False

第一种方法是提前退出这个答案 https://stackoverflow.com/a/89250/3996580它想要返回唯一的值,其中第二个与应用于这个答案 https://stackoverflow.com/a/480227/3996580.

>>> import numpy as np
>>> X = np.random.normal(0,1,[10000])
>>> def terhorst_early_exit(X):
...:     elems = set()
...:     for i in X:
...:         if i in elems:
...:             return True
...:         elems.add(i)
...:     return False
>>> %timeit terhorst_early_exit(X)
100 loops, best of 3: 10.6 ms per loop
>>> def peterbe_early_exit(X):
...:     seen = set()
...:     seen_add = seen.add
...:     for x in X:
...:         if (x in seen or seen_add(x)):
...:             return True
...:     return False
>>> %timeit peterbe_early_exit(X)
100 loops, best of 3: 9.35 ms per loop
>>> %timeit len(set(X)) != len(X)
100 loops, best of 3: 4.54 ms per loop
>>> %timeit len(np.unique(X)) != len(X)
1000 loops, best of 3: 967 µs per loop

如果你从一个普通的 Python 列表开始,而不是一个numpy.ndarray?

>>> X = X.tolist()
>>> %timeit terhorst_early_exit(X)
100 loops, best of 3: 9.34 ms per loop
>>> %timeit peterbe_early_exit(X)
100 loops, best of 3: 8.07 ms per loop
>>> %timeit len(set(X)) != len(X)
100 loops, best of 3: 3.09 ms per loop
>>> %timeit len(np.unique(X)) != len(X)
1000 loops, best of 3: 1.83 ms per loop

编辑:如果我们事先期望重复项的数量怎么办?

上述比较是在以下假设下进行的:a)可能没有重复项,或者 b)我们更担心最坏的情况而不是平均情况。

>>> X = np.random.normal(0, 1, [10000])
>>> for n_duplicates in [1, 10, 100]:
>>>     print("{} duplicates".format(n_duplicates))
>>>     duplicate_idx = np.random.choice(len(X), n_duplicates, replace=False)
>>>     X[duplicate_idx] = 0
>>>     print("terhost_early_exit")
>>>     %timeit terhorst_early_exit(X)
>>>     print("peterbe_early_exit")
>>>     %timeit peterbe_early_exit(X)
>>>     print("set length")
>>>     %timeit len(set(X)) != len(X)
>>>     print("numpy unique length")
>>>     %timeit len(np.unique(X)) != len(X)
1 duplicates
terhost_early_exit
100 loops, best of 3: 12.3 ms per loop
peterbe_early_exit
100 loops, best of 3: 9.55 ms per loop
set length
100 loops, best of 3: 4.71 ms per loop
numpy unique length
1000 loops, best of 3: 1.31 ms per loop
10 duplicates
terhost_early_exit
1000 loops, best of 3: 1.81 ms per loop
peterbe_early_exit
1000 loops, best of 3: 1.47 ms per loop
set length
100 loops, best of 3: 5.44 ms per loop
numpy unique length
1000 loops, best of 3: 1.37 ms per loop
100 duplicates
terhost_early_exit
10000 loops, best of 3: 111 µs per loop
peterbe_early_exit
10000 loops, best of 3: 99 µs per loop
set length
100 loops, best of 3: 5.16 ms per loop
numpy unique length
1000 loops, best of 3: 1.19 ms per loop

因此,如果您期望很少有重复项,numpy.unique功能才是出路。随着预期重复次数的增加,早期退出方法占主导地位。

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

检查 python 列表/numpy ndarray 中是否存在重复项的最快方法 的相关文章

随机推荐

  • 限制 GWT 中的小数位数?

    在纯 Java 中 我通常会使用如下所示的函数来将小数位数限制为decimalCount对于给定的数字value 但是 根据 GWT 文档 GWT 不提供对日期和数字格式化类 例如 java text DateFormat java tex
  • 如何在Python 3.6中等待声音文件以vlc结尾

    我在 python 中的 vlc 有一个问题 import vlc sound vlc MediaPlayer sound mp3 sound play i wanna wait until the sound ends then do s
  • Java:没有 AtomicFloat 或 AtomicDouble 吗?

    我已经发现AtomicInteger AtomicLong 但是在哪里AtomicFloat or AtomicDouble 也许有什么技巧 API 文档为java util concurrent package http download
  • 在多租户数据库中索引 TenantID

    我正在为应用程序创建多租户数据库 我在每个表方法中都使用了 TenantID 效果非常好 我正处于性能调整阶段 我的问题是 每个表中的每个 TenantID 是否都应该建立索引以进行优化搜索 因为数据库上的每个查询都会在此列上进行过滤 期待
  • 在node.js中重新定义变量

    该脚本的执行 tmp js 其中包含 var parameters 1 eval var parameters a 1 1 eval console log parameters node tmp js 产生 如果我们注释掉第一条语句 并再
  • 使用.NET Moq时如何转发到另一个对象?

    给定一个对象 我想创建一个模拟 它实现该对象的接口并模拟一个方法 但将其余方法转发给真实对象 不是基类 例如 ISqlUtil sqlUtil GetTheRealSqlUtilObjectSomehow var mock new Mock
  • 如何获得更多的饲料项目?

    如何获取 Feed 的下一页或更多结果 例如 当我去现在安全 http leoville tv podcasts sn xmlfeed 页面 没有任何类型的 下一个 链接 并且 page 100 的 url 参数不执行任何操作 http l
  • 权限如何在 mac 上运行 sbin 命令?

    我正在使用 mac os x 并且我正在尝试运行shutdown命令但它说我不是超级用户 不过 我可以跑ifconfig无需成为超级用户 这两个命令都在 sbin 中 我的 PATH 环境变量包括 sbin 这就是为什么我可以运行 ifco
  • Mathf.Floor 与 (int) 的性能比较

    当我想知道哪个更快时 我正在创建和翻译一些算法 a int float or b Mathf FloorToInt float 提前致谢 编辑 如果有比这两种方法更快的方法 那也会有帮助 像我提到的那样用秒表进行测试 这个答案在这里是因为我
  • 查询外键嵌套for循环django

    我正在尝试返回企业的类别列表 对于每个类别 我想列出与该类别相关的所有项目 我要退回所有物品 而不是按类别 但我决定要按类别对它们进行排序 这就是我所尝试过的 以及其他尝试 我只是无法将这些项目归入这些类别 这是我最新的尝试 在我的 mod
  • 从使用 pyinstaller 导入 theano 的 python 3 脚本构建适用于 Windows 的 .exe

    2017年9月2日下午1点编辑 经过多次尝试后 我最终成功地用 pyinstaller 构建了一个 exe 不幸的是 我未能处理 theano 模块 在我的情况下是 pymc3 模块所需的 我不得不修改 py 文件并放弃部分应用程序 我下面
  • 捕获组的负向前瞻

    我正在尝试这个挑战 https regex alf nu 4 https regex alf nu 4 我想匹配所有不包含 ABBA 模式的字符串 Match aesthophysiology amphimictical baruria c
  • 在单个 DNS 查询中请求 A 和 AAAA 记录

    我正在用 C 语言实现 DNS 查询 并且有兴趣在单个查询数据包中请求 A 和 AAAA IPv4 和 IPv6 记录 但是当我将两个查询放在一起时 我没有从名称服务器获得任何响应像这样的一包 我尝试将查询发送到几个不同的名称服务器 本地和
  • 是否可以在一行 PowerShell 中启动具有多个选项卡的 Microsoft Edge?

    我希望能够通过快捷方式 而不是脚本 中的单个 PowerShell 命令启动带有多个选项卡的 Microsoft Edge Chromium 这是我对一个选项卡有效的内容 C Windows System32 WindowsPowerShe
  • Windows 驱动程序开发:Visual Studio 2012 中缺少部署选项

    我试图编译和部署世界粮食计划署样本取自 MSDN http code msdn microsoft com windowshardware Windows Filtering Platform ae42c8d7 called msnmntr
  • PHP 致命错误:无法重新声明函数[重复]

    这个问题在这里已经有答案了 我在文件 B inc 中有一个函数 A line 2 function A line 10 在阿帕奇日志中 PHP 致命错误 无法在第 10 行的 B 中重新声明 A 之前在 B inc 2 中声明 我想你正在使
  • 如何自动展开所有TreeView节点?

    我想在应用程序启动时展开主窗体上的树 我怎样才能做到呢 我找不到相应的属性 C 生成器 2009 您只需致电FullExpand http docwiki embarcadero com VCL en ComCtrls TCustomTre
  • 如何让键盘选项卡聚焦于div

    I made a message box on which there are two buttons on it Basically it s a jQuery plugin that popup with the overlay eff
  • vbscript输出到控制台

    使用 vbscript 将结果输出到控制台的命令或最快方法是什么 你的意思是 WScript Echo Like this 如果你在下面运行它wscript exe vbs 扩展名的默认处理程序 因此双击脚本会得到什么 您将看到一个 Mes
  • 检查 python 列表/numpy ndarray 中是否存在重复项的最快方法

    我想确定我的列表 实际上是numpy ndarray 在尽可能最快的执行时间内包含重复项 请注意 我并不关心删除重复项 我只是想知道是否有重复项 注意 如果这不是重复的 我会感到非常惊讶 但我已尽力而为却找不到 最近的是这个问题 https