gpt4 book ai didi

rust - 为什么这个 hashmap 搜索比预期的要慢?

转载 作者:行者123 更新时间:2023-11-29 08:06:40 44 4
gpt4 key购买 nike

检查 key 的 HashMap 的最佳方法是什么?目前我正在使用这个:

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

self.search(k).is_some()

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

此外,

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

这可以更地道地写成

if let Some(v) = n {

关于rust - 为什么这个 hashmap 搜索比预期的要慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071415/

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