Первое приводит к тому, что все результаты вычисляются и сохраняются, в то время как второе является ленивой нагрузкой, в результате чего результаты вычисляются только по запросу. То есть один будет хранить и создавать список из N элементов, а другой будет хранить и создавать 0 элементов до тех пор, пока вы не начнете перебирать их.
Лучший способ думать об этом - использовать ifilter (из itertools ), в котором вы делаете то же самое, что и yield, за исключением того, что вы генерируете итератор вместо генератора:
ifilter(process, resp.results)
Я обнаружил, что итераторы, как правило, выполняются быстрее, чем генераторы в серии 2.x, но я не могу проверить какую-либо экономию в серии 3.x.