Qual é o custo da len()
função para built-ins do Python? (lista / tupla / string / dicionário)
290
Qual é o custo da len()
função para built-ins do Python? (lista / tupla / string / dicionário)
É O (1) (tempo constante, não dependendo do comprimento real do elemento - muito rápido) em todos os tipos que você mencionou, mais set
e outros como array.array
.
Chamar len () nesses tipos de dados é O (1) no CPython , a implementação mais comum da linguagem Python. Aqui está um link para uma tabela que fornece a complexidade algorítmica de muitas funções diferentes no CPython:
Página Wiki do TimeComplexity Python
fonte
Todos esses objetos mantêm o controle de seu próprio comprimento. O tempo para extrair o comprimento é pequeno (O (1) em notação O-grande) e consiste principalmente em [descrição aproximada, escrita em termos de Python, não em termos de C]: procure "len" em um dicionário e envie-o para o A função built_in len que procurará o
__len__
método do objeto e chamará isso ... tudo o que precisa fazer éreturn self.length
fonte
length
aparece no dicionário pordir(list)
?list.lenght
variável ilustrada é implementada em C, não em Python.As medições abaixo fornecem evidências de
len()
O (1) para estruturas de dados frequentemente usadas.Uma observação referente a
timeit
: Quando o-s
sinalizador é usado e duas cadeias são passadas paratimeit
a primeira, é executada apenas uma vez e não é cronometrada.Lista:
Tupla:
Corda:
Dicionário (compreensão de dicionário disponível em 2.7+):
Matriz:
Conjunto (compreensão do conjunto disponível em 2.7+):
Deque:
fonte
len()
e também corrigi as medidas para usar corretamente o-s
sinalizador.python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"
223 nsec por looppython -m timeit -s "l = range(100);" "len(l)"
66,2 nsec por looplen é um O (1) porque, na sua RAM, as listas são armazenadas como tabelas (séries de endereços contíguos). Para saber quando a tabela para, o computador precisa de duas coisas: comprimento e ponto de partida. É por isso que len () é O (1), o computador armazena o valor e, portanto, só precisa procurá-lo.
fonte
Eu estive pensando em len () em Python depende do tamanho da lista, então eu sempre armazeno o comprimento em uma variável se eu usar várias vezes. Mas hoje, durante a depuração, notei o atributo __len__ no objeto list, então len () deve apenas buscá-lo, o que torna a complexidade O (1). Então, pesquisei no Google se alguém já perguntou e me deparei com este post.
fonte
__len__
é uma função contínua, não uma variável que representa comprimento de uma lista.list.__len__
função é executada em tempo constante? Sim, mas não apenas por causa disso, é uma função. Porque foi implementado assim.