Iterators

collect

Iterator::collect将一个迭代器转换为一个集合,如Vec,它通常需要一个分配。如果该集合只是再次迭代,你应该避免调用collect

出于这个原因,从函数中返回一个迭代器类型,比如impl Iterator<Item=T>,往往比Vec<T>更好。请注意,有时这些返回类型需要额外的生存期,正如this post所解释的那样。 Example.

同样,你可以使用extend用迭代器扩展一个现有的集合(如Vec),而不是将迭代器收集到Vec中,然后使用append

最后,当编写迭代器时,如果可能的话,实现 Iterator::size_hintExactSizeIterator::len 方法通常是值得的。使用该迭代器的 collectextend 调用可能会减少分配,因为它们提前了解迭代器产生的元素数量信息。

Chaining

chain可以非常方便,但也可能比单个迭代器慢。如果可能的话,热迭代器可能值得避免。 Example.

类似地,filter_map可能比使用filtermap更快。

Chunks

当需要一个分块迭代器,并且已知分块大小恰好能整除切片长度时,应该使用更快的 slice::chunks_exact 而不是 slice::chunks

当分块大小不确定能否恰好整除切片长度时,仍然可以更快地使用 slice::chunks_exact,结合 ChunksExact::remainder 或手动处理多余元素。 Example 1, Example 2.

同样适用于相关的迭代器: