Почему один и тот же процесс занимает больше времени в Rust, чем в Python?

#python #rust

#python #Ржавчина

Вопрос:

У меня есть очень простой код в python

 x = "ABCD ss xx ta"
l = x.split(" ")

for i, y in enumerate(l):
    print(f"{i}: {y}")

 

что занимает

 real    0m0.037s
user    0m0.026s
sys     0m0.004s
 

Я сделал то же самое, в Rust котором скомпилирован — это должно быть быстрее

 fn main() {
    let split = "ABCD ss xx ta".split(" ");
    for (i, s) in split.enumerate() {
        println!("{}:{}", i, s)
    }
}

 

что занимает

 real    0m0.159s
user    0m0.142s
sys     0m0.012s

 

Я хотел бы спросить здесь, почему здесь компилируется Python быстрее, чем скомпилированный Rust , с которым я работаю cargo run (уже скомпилированный)?

Комментарии:

1. Если код выполняет ввод-вывод, это обычно слишком сложно, поэтому компиляция и интерпретация не имеют большого значения. Разница заключается в библиотеках ввода-вывода.

2. На самом деле это не совсем корректный тест. Первый запуск, как правило, будет намного медленнее. Запустите каждый из них ~ 100 раз и посмотрите, что получится в целом. Кроме того, имейте в виду, что здесь играют роль многие факторы. Например, часть накладных расходов Rust может быть связана с загрузкой DLL-файлов или чего-то подобного.

3. Если вы только используете cargo run , то он работает в неоптимизированном режиме отладки. Используйте --release флаг, чтобы включить оптимизацию для кода rust.

4. Я подозреваю, что использование cargo run также занимает много времени. Попробуйте запустить скомпилированный исполняемый файл напрямую.

5. Использование rust означает, что вы включаете время компиляции. Тестируйте скомпилированный двоичный файл напрямую.

Ответ №1:

Во-первых, я не эксперт по python, но python, а также python3 не запускают ваш код, я получаю ошибки. Изменение его на:

 x = "ABCD ss xx ta"
l = x.split(" ")

for i, y in enumerate(l):
    print(i , y)
 

Дает мне (python 3):

 real    0m0.020s
user    0m0.016s
sys 0m0.000s
 

Теперь по реальной причине, я полагаю, что вы компилируете с использованием символов отладки, а также включаете время соответствия в свое утверждение. Когда я создаю ваш ящик с cargo build --release помощью и запускаю двоичный файл напрямую (который помещается в ./target/release/), я получаю:

 real    0m0.003s
user    0m0.000s
sys 0m0.000s
 

Что намного лучше, (как обычно бывает с rust:))!

Комментарии:

1. Ваш Python, вероятно, старше версии 3.6, которая является первой версией, поддерживающей f-строки.