gpt4 book ai didi

bash - 删除大型单词列表中重复项的最快方法?

转载 作者:行者123 更新时间:2023-11-29 09:12:59 25 4
gpt4 key购买 nike

<分区>

类似的问题是 made here但他们没有说明为什么 sortawk 之间存在速度差异。

我首先在 Unix Stackexchange 上提出了这个问题但既然他们告诉我这对 Stackoverflow 来说是个好问题,我就把它贴在这里。

我需要对一个大型词表进行去重。我尝试了几个命令并做了一些研究 herehere他们解释说,删除单词列表重复项的最快方法似乎是使用 awk,因为 awk 不会对列表进行排序。它使用散列查找来跟踪项目并删除重复项。由于 AWK 使用散列查找,他们认为大 O 是这样的

awk --> O(n) ?
sort --> O(n log n) ?

但是我发现这不是真的。这是我的测试结果。我使用 this python script 生成了两个随机词表.

列表 1 = 7 Mb
列表 2 = 690 Mb

测试命令

sort -u input.txt -o output.txt 

awk '!x[$0]++' input.txt > output.txt

AWK 结果:
List1
真正的 0m1.643s
用户 0m1.565s
系统 0m0.062s

List2
真正的 2m6.918s
用户 2m4.499s
系统 0m1.345s

结果排序:
List1
真实的 0m0.724s
用户 0m0.666s
系统 0m0.048s

List2
真正的 1m27.254s
用户 1m25.013s
系统 0m1.251s

我一遍又一遍地进行这些测试并找到了一致的结果。也就是说,SORT 要快得多。有人可以解释为什么以及是否有更快的方法来做到这一点?

************ 更新 ************
可能会影响我结果的事情是

  1. 缓存:我已经通过改变顺序排除了这种可能性执行测试
  2. 大 O 符号的常数因子。由于单词列表的大小,我认为此时它们应该变得无关紧要。 (600Mb)
  3. 算法的错误实现:这仍然是一种可能性我还没有检查 awk 和排序的源代码

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com