为什么Rust HashMap比Python dict慢?[已关闭]

k5hmc34c  于 2022-11-30  发布在  Python
关注(0)|答案(1)|浏览(171)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答案。

这个问题是由一个打字错误或一个无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
我在Rust和Python中编写了使用dict和hashmap执行相同计算的脚本。不知何故,Python版本的速度要快10倍以上。这是如何发生的?
rust 脚本:`

use std::collections::HashMap;
use std::time::Instant;

fn main() {
    let now = Instant::now();

    let mut h = HashMap::new();
    for i in 0..1000000 {
        h.insert(i, i);
    }

    let elapsed = now.elapsed();
    println!("Elapsed: {:.2?}", elapsed);
}

输出:Elapsed: 828.73ms
Python脚本:

import time

start = time.time()
d = dict()

for i in range(1000000):
    d[i] = i

print(f"Elapsed: {(time.time() - start) * 1000:.2f}ms")

输出:Elapsed: 64.93ms
对于字符串键也是如此。我搜索了关于HashMap的不同散列器的不同解决方案,但没有一个能提供超过10倍的速度提升

gajydyqb

gajydyqb1#

Rust在默认情况下没有启用优化,因为它在调试时很烦人,这使得它在调试模式下比Python慢,启用优化应该可以解决这个问题。
这种行为并不是Rust特有的,它是大多数编译器的默认行为(如用于C/C++的gcc/g++clang,两者都需要-O3标志以获得最大性能)。
您可以通过将--release标志添加到相应的cargo命令来启用Rust中的优化,例如:

cargo run --release

Python并不区分有没有优化,因为Python是一种解释语言,没有(显式的)编译步骤。
下面是您的代码在我的计算机上的行为:

  • Python:约180毫秒
  • rust eclipse :~1750 ms
  • rust eclipse (带--release):约160毫秒

Python的dict实现很可能是用C编写的,并且经过了大量优化,因此它在性能上应该与Rust的HashMap类似,这正是我在我的机器上看到的。

相关问题