itertools.tee is only better than list() in the best case, but I use the worst-case behavior here. I iterate over the _entire iterator_ once, and then I do it again somewhere else. So tee is forced to store the entire iterator anyway -- same memory usage as a list.

There's a couple of cases (rendering? maybe more) where I could be iterating and am caching to a list instead. That's changing right now though.