Conjunto vs. desempenho frozenset
Eu estava mexendo com o Pythonset
efrozenset
tipos de coleção.
Inicialmente, eu assumi quefrozenset
proporcionaria um melhor desempenho de pesquisa do queset
, como imutável e, portanto, poderia explorar a estrutura dos itens armazenados.
No entanto, esse não parece ser o caso, com relação ao seguinte experimento:
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)
Eu executei esse código usando o CPython e o PyPy, que forneceram os seguintes resultados:
> pypy set.py 100000000
set : 6.156
frozenset: 6.166
> python set.py 100000000
set : 16.824
frozenset: 17.248
Parece quefrozenset
é realmente mais lento em relação ao desempenho da pesquisa, tanto no CPython quanto no PyPy. Alguém tem uma idéia de por que esse é o caso? Eu não olhei para as implementações.