Вот мой код 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
дают тот же результат.
Я понимаю, что set
Python реализован на 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]'
Руст версия
$ rustc --version
rustc 1.5.0 (3d7cd77e4 2015-12-04)
Я использую Ubuntu 14.04, и моя системная архитектура x86_64.