It’s already optimized. Under the hood an array iterator is just a pointer to some memory. After the iterator gets one value, it simply moves the pointer forward to the next value.
It also stores an end pointer so it can quickly test if it has reached the end of the array. This is very efficient.
Chaining iterators is often no less efficient. The first iterator takes one value from memory, the next iterator operates on the value from the first iterator and then the next operates on the value from that iterator, etc until all iterators have run.
Then it goes round again. The first iterator takes another value from memory… etc, etc. Exactly like a for loop.