为什么这个哈希图搜索比预期的慢

  • 本文关键字:图搜索 哈希 rust
  • 更新时间 :
  • 英文 :


检查键的哈希映射的最佳方法是什么?目前我正在使用这个:

let hashmap = HashMap::<&str, &str>::new();  // Empty hashmap
let name = "random";
for i in 0..5000000 {
    if !hashmap.contains_key(&name) { 
        // Do nothing
        }
}

这在大多数情况下似乎很快,并且在如图所示运行时需要0.06秒,但是当我在以下循环中使用它时,它变得非常慢,在我的机器上几乎需要1分钟。(这是与cargo run --release编译)。这段代码的目的是打开一个外部程序,并遍历该程序的输出。

let a = vec!["view", "-h"]; // Arguments to open process with
let mut child = Command::new("samtools").args(&a)
                                        .stdout(Stdio::piped())
                                        .spawn()
                                        .unwrap();
let collect_pairs = HashMap::<&str, &str>::new();
if let Some(ref mut stdout) = child.stdout {
    for line in BufReader::new(stdout).lines() {
        // Do stuff here          
        let name = "random";
        if !collect_pairs.contains_key(&name) {
            // Do nothing
        }
    }
}

由于某种原因,添加if !collect_pairs.contains_key(行使运行时间增加了近一分钟。child的输出大约是500万行。所有这些代码都存在于fn main()

编辑

这似乎解决了这个问题,导致快速运行时间,但我不知道为什么!hashmap.contains_key在这里不能很好地工作:

let n: Option<&&str> = collect_pairs.get(name);
if match n {Some(v) => 1, None => 0} == 1 {
  // Do something
}

需要考虑的一件事是HashMap<K, V>默认使用加密安全哈希算法,因此它本质上总是有点慢。

get()归结为

self.search(k).map(|bucket| bucket.into_refs().1)

contains_key is

self.search(k).is_some()

因此,get()对你来说更快对我来说似乎很奇怪,它做了更多的工作!

,

if match n {Some(v) => 1, None => 0} == 1 {

可以更习惯地写成

if let Some(v) = n {

我发现我的问题了,很抱歉直到现在才接电话。我没有正确检查if !collect_pairs.contains_key(&name)的返回。由于某种原因,它返回true,导致if块的其余部分正在运行。我假设它是评估到false。谢谢你的帮助

最新更新