В настоящее время я изучаю Kotlin и у меня есть вопрос о последовательности против коллекций .
Я прочитал сообщение в блоге об этой теме, и там вы можете найти этот фрагмент кода:
Список реализации:
val list = generateSequence(1) { it + 1 }
.take(50_000_000)
.toList()
measure {
list
.filter { it % 3 == 0 }
.average()
}
// 8644 ms
Последовательность реализации:
val sequence = generateSequence(1) { it + 1 }
.take(50_000_000)
measure {
sequence
.filter { it % 3 == 0 }
.average()
}
// 822 ms
Дело в том, что реализация Sequence примерно в 10 раз быстрее.
Однако я не очень понимаю, ПОЧЕМУ это так. Я знаю, что с Sequence вы выполняете "ленивую оценку", но я не могу найти причину, почему это помогает сократить обработку в этом примере.
Однако здесь я знаю, почему последовательность обычно быстрее:
val result = sequenceOf("a", "b", "c")
.map {
println("map: $it")
it.toUpperCase()
}
.any {
println("any: $it")
it.startsWith("B")
}
Поскольку с помощью Sequence вы обрабатываете данные «по вертикали», когда первый элемент начинается с «B», вам не нужно отображать остальные элементы. Здесь есть смысл.
Итак, почему это также быстрее в первом примере?