迭代器

collectextend

Iterator::collect 将迭代器转换为诸如 Vec 之类的集合,这通常需要进行分配。如果转换成集合之后只是再次进行迭代,应避免调用 collect

因此,通常最好从函数返回像 impl Iterator<Item=T> 这样的迭代器类型,而不是 Vec<T>。请注意,有时这些返回类型需要额外的生命周期,正如这篇博文所解释的那样。 示例

类似地,你可以使用 extend 来扩展现有集合(如 Vec)的迭代器,而不是将迭代器收集到 Vec 中,然后使用 append

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

链式调用

chain 可能非常方便,但与单个迭代器相比,它也可能更慢。如果可能的话,对于热迭代器,最好避免使用它。 示例

类似地,filter_map 可能比先使用 filter 再使用 map 更快。

块 (chunks)

当需要分块迭代器且块大小已知确切地能整除切片长度时,使用更快的 slice::chunks_exact 而不是 slice::chunks

当块大小未知确切地能整除切片长度时,仍然可以更快地使用 slice::chunks_exact 结合 ChunksExact::remainder 或手动处理多余元素。 示例 1, 示例 2

对于相关的迭代器也是如此: