Ecco il mio codice Python:Python insieme intersezione è più veloce quindi Rust HashSet intersezione
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
E qui è il mio codice 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);
}
Credo che queste siano o meno equivalente. Ottengo i seguenti risultati di performance:
time python set_performance.py
50000000
real 0m11.757s
user 0m11.736s
sys 0m0.012s
e
rustc set_performance.rs -O
time ./set_performance 50000000
real 0m17.580s
user 0m17.533s
sys 0m0.032s
(costruzione con cargo
e --release
dare lo stesso risultato).
Mi rendo conto che Python set
è implementato in C, e quindi dovrebbe essere veloce, ma non mi aspettavo che fosse più veloce di Rust. Non dovrebbe fare controlli di tipo extra che Rust non dovrebbe?
Forse mi manca qualcosa nel modo in cui compilo il mio programma Rust, ci sono altri flag di ottimizzazione che dovrei usare?
Un'altra possibilità è che il codice non è realmente equivalente, e Rust sta facendo inutili lavori extra, mi manca qualcosa?
Python Versione:
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 versione (lo so 1.6 è fuori)
$ rustc --version
rustc 1.5.0 (3d7cd77e4 2015-12-04)
Sto usando ubuntu 14.04
e la mia architettura del sistema è x86_64.
Quando sposto il set-building dal loop e ripeto solo l'intersezione, per entrambi i casi, ovviamente, Rust è più veloce di python2.7. Quindi la domanda è leggermente sbagliata. – bluss
@bluss buon punto, sulla mia macchina 'ruggine' è solo un po 'più veloce,' 0m4.168s' contro '0m3.838s'. E l'inizializzazione richiedeva un bel po 'di tempo. Grazie ancora. – Akavall
@bluss * Ma * se uso 'set1 & set2' su PyPy3 ottengo 1.0s vs 2.3s, quindi Python torna in testa, P – Veedrac