Предложение take_while
из ответа zwol является наиболее идиоматичным и, следовательно, обычно лучшим выбором. Вся информация о цикле хранится вместе в одном выражении, а не смешивается в теле цикла.
Однако, самая быстрая реализация предназначена для предварительного вычисления квадратного корня из n
(на самом деле это странный вид округленного вниз квадратного корня). Это позволяет избегать сравнения на каждой итерации, поскольку вы знаете, что это всегда конечное значение i
.
let m = (n as f64 - 0.5).sqrt() as _;
for i in 2 ..= m {
// code goes here
}
В качестве примечания я попытался сравнить эти разные циклы. take_while
был самым медленным. Версия, которую я только что предложил, всегда сообщала 0 ns/iter
, и я не уверен, что это просто из-за того, что какой-то код оптимизирован до такой степени, что он вообще не работает, или он действительно слишком быстрый для измерения. Для большинства случаев разница не должна быть важной.