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.

questionAnswers(2)

yourAnswerToTheQuestion