检查键的哈希映射的最佳方法是什么?目前我正在使用这个:
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
。谢谢你的帮助