Набор против производительности Frozenset
Я возился с питономset
а такжеfrozenset
типы коллекций.
Первоначально я предполагал, чтоfrozenset
обеспечит лучшую производительность поиска, чемset
, поскольку его неизменный и, следовательно, может использовать структуру хранимых предметов.
Тем не менее, это не относится к следующему эксперименту:
import random
import time
import sys
def main(n):
numbers = []
for _ in xrange(n):
numbers.append(random.randint(0, sys.maxint))
set_ = set(numbers)
frozenset_ = frozenset(set_)
start = time.time()
for number in numbers:
number in set_
set_duration = time.time() - start
start = time.time()
for number in numbers:
number in frozenset_
frozenset_duration = time.time() - start
print "set : %.3f" % set_duration
print "frozenset: %.3f" % frozenset_duration
if __name__ == "__main__":
n = int(sys.argv[1])
main(n)
Я выполнил этот код, используя как CPython, так и PyPy, что дало следующие результаты:
> pypy set.py 100000000
set : 6.156
frozenset: 6.166
> python set.py 100000000
set : 16.824
frozenset: 17.248
Кажется, чтоfrozenset
на самом деле медленнее в отношении производительности поиска, как в CPython, так и в PyPy. У кого-нибудь есть идея, почему это так? Я не смотрел в реализации.