イテレータ

(原文)

collectextend

Iterator::collect はイテレータを Vec のようなコレクション型に変換します。これは通常割り当てを必要とします。もしコレクション型がその後再びイテレートされるだけなのであれば、collect の呼び出しは避けるべきです。

上記の理由から、Vec<T> よりも impl Iterator<Item=T> といったイテレータ型を関数から返した方が多くの場合好ましいです。ただ、この記事で説明されているように、そういった返り値には追加のライフタイム注釈が必要となる場合があることに注意してください。

同様に、イテレータを Vec にして append を使うよりも、イテレータを使って既存のコレクション型(Vec など)を拡張するために extend を使った方が良いでしょう。

最後に、イテレータを書くときは、可能であれば Iterator::size_hintExactSizeIterator::len メソッドを実装した方が多くの場合好ましいです。その理由として、イテレータによって生成される要素数についての事前情報が手に入るため、イテレータを使う collectextend といった呼び出しにおいてより小さな割り当てを行える、というものがあります。

チェイン

chain はとても便利ですが、単一のイテレータより遅くなることがあります。可能であればホットなイテレータに対しては使用を避けるべきでしょう。

同様に、map に続けて filter を使うよりも、filter_map を使用した方が高速になることがあります。