#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-строки.