这是我的Python代码:
len_sums = 0
for i in xrange(100000):
set_1 = set(xrange(1000))
set_2 = set(xrange(500, 1500))
intersection_len = len(set_1.intersection(set_2))
len_sums += intersection_len
print len_sums
这是我的 Rust 代码:
use std::collections::HashSet;
fn main() {
let mut len_sums = 0;
for _ in 0..100000 {
let set_1: HashSet<i32> = (0..1000).collect();
let set_2: HashSet<i32> = (500..1500).collect();
let intersection_len = set_1.intersection(&set_2).count();
len_sums += intersection_len;
}
println!("{}", len_sums);
}
我相信它们大致是等价的。我得到了以下性能结果:
time python set_performance.py
50000000
real 0m11.757s
user 0m11.736s
sys 0m0.012s
和
rustc set_performance.rs -O
time ./set_performance 50000000
real 0m17.580s
user 0m17.533s
sys 0m0.032s
cargo
和--release
构建出的结果相同。
我知道Python中的set
是用C实现的,因此期望它很快,但是我没有预料到它会比Rust还要快。难道它不必执行Rust需要执行的额外类型检查吗?
也许我在编译Rust程序时漏掉了什么,有没有其他优化标志应该使用呢?
另一个可能性是代码实际上并不等价,而Rust正在做一些不必要的额外工作。我有什么遗漏吗?
Python版本:
In [3]: import sys
In [4]: sys.version
Out[4]: '2.7.6 (default, Jun 22 2015, 17:58:13) \n[GCC 4.8.2]'
Rust版本
$ rustc --version
rustc 1.5.0 (3d7cd77e4 2015-12-04)
我正在使用Ubuntu 14.04,我的系统架构是x86_64。
rust
只比它慢了一点点,0m4.168s
对比0m3.838s
。而且初始化也花费了不少时间。再次感谢。 - Akavallset1 & set2
,我得到的时间是1.0秒对比2.3秒,所以Python又重新领先了;P - Veedrac