Давайте попробуем разведку боем. Маленький код на Python2. Перечисление:
import datetime
def timeit(func, *args):
t1=datetime.datetime.now()
func(*args)
print datetime.datetime.now()-t1
data_l=range(int(1e7*2))
data_t=tuple(data_l)
data_s=set(data_l)
def l(var):
a=0
for i in var:
a+=1
timeit(l, data_l)
timeit(l, data_t)
timeit(l, data_s)
Проверка на вхождение (тот же поиск):
def search(data):
int(1e7*2)/2 in data
timeit(search, data_l)
timeit(search, data_t)
timeit(search, data_s)
Результаты:
Перечисление:
0:00:01.157000
0:00:01.156000
0:00:01.297000
Поиск:
0:00:00.281000
0:00:00.234000
0:00:00
1) Отсюда можно сделать вывод о том что множества хороши при поиске,но не при перечислении.
2) Раз уж мы говорим о больших массивах, то разница между range(int(1e7)) и set(xrange(int(1e7))) по занимаемой памяти у меня (WinXP) составляет 157.3 и 247.3Мб =90 Мб (или 57%), что составляет внушительную лишнюю нагрузку.
Поэтому мой вывод такой: для каждой цели хороши свои средства. Если не прав где то - поправьте меня, я человек = я могу ошибаться :-)