No Python, qual estrutura de dados é mais eficiente / rápida? Supondo que essa ordem não seja importante para mim e eu estaria procurando duplicatas de qualquer maneira, um conjunto de Python é mais lento que uma lista de Python?
python
list
performance
data-structures
set
Mantas Vidutis
fonte
fonte
As listas são um pouco mais rápidas que as configurações quando você deseja iterar sobre os valores.
Os conjuntos, no entanto, são significativamente mais rápidos que as listas, se você deseja verificar se um item está contido nele. Eles podem conter apenas itens exclusivos.
Acontece que as tuplas funcionam quase exatamente da mesma maneira que as listas, exceto por sua imutabilidade.
Iterando
Determinar se um objeto está presente
fonte
Lista de desempenho:
Definir desempenho:
Você pode considerar as Tuplas , pois são semelhantes às listas, mas não podem ser modificadas. Eles ocupam um pouco menos de memória e são mais rápidos de acessar. Eles não são tão flexíveis, mas são mais eficientes que as listas. Seu uso normal é servir como chaves de dicionário.
Os conjuntos também são estruturas de sequência, mas com duas diferenças entre listas e tuplas. Embora os conjuntos tenham uma ordem, essa ordem é arbitrária e não está sob o controle do programador. A segunda diferença é que os elementos em um conjunto devem ser exclusivos.
set
por definição. [ python | wiki ].fonte
set
link de tipo interno ( docs.python.org/2/library/stdtypes.html#set ) e não asets
biblioteca descontinuada . Segundo, "Conjuntos também são estruturas de sequência", leia o seguinte no link de tipo interno: "Sendo uma coleção não ordenada, os conjuntos não registram a posição do elemento ou a ordem de inserção. Dessa forma, os conjuntos não suportam indexação, fatia ou outras comportamento de sequência ".range
não élist
.range
é uma classe especial com__contains__
método mágico personalizado .xrange
)Set
vitórias devido a verificações quase instantâneas 'contém': https://en.wikipedia.org/wiki/Hash_tableImplementação da lista : geralmente uma matriz, baixo nível próximo ao metal, bom para iteração e acesso aleatório pelo índice de elementos.
Defina a implementação: https://en.wikipedia.org/wiki/Hash_table , não itera em uma lista, mas localiza o elemento calculando um hash da chave, portanto depende da natureza dos elementos-chave e do hash função. Semelhante ao que é usado para dict. Eu suspeito que
list
poderia ser mais rápido se você tiver muito poucos elementos (<5), quanto maior a contagem de elementos, melhorset
será o desempenho para uma verificação de contenção. Também é rápido para adição e remoção de elementos. Também tenha sempre em mente que construir um conjunto tem um custo!NOTA : Se o
list
já estiver classificado, a pesquisa nolist
pode ser bastante rápida, mas, nos casos habituais, aset
é mais rápido e mais simples para as verificações.fonte
tl; dr
As estruturas de dados (DS) são importantes porque são usadas para executar operações nos dados, o que basicamente implica: pegar alguma entrada , processá-la e devolver a saída .
Algumas estruturas de dados são mais úteis que outras em alguns casos específicos. Portanto, é bastante injusto perguntar qual (DS) é mais eficiente / rápido. É como perguntar qual ferramenta é mais eficiente entre uma faca e um garfo. Quero dizer, tudo depende da situação.
Listas
Uma lista é uma sequência mutável , normalmente usada para armazenar coleções de itens homogêneos .
Conjuntos
Um objeto definido é uma coleção não ordenada de objetos hash distintos . É comumente usado para testar a associação, remover duplicatas de uma sequência e calcular operações matemáticas como interseção, união, diferença e diferença simétrica.
Uso
De algumas das respostas, fica claro que uma lista é muito mais rápida que um conjunto ao iterar sobre os valores. Por outro lado, um conjunto é mais rápido que uma lista ao verificar se um item está contido nele. Portanto, a única coisa que você pode dizer é que uma lista é melhor que um conjunto para algumas operações específicas e vice-versa.
fonte
Eu estava interessado nos resultados ao verificar, com CPython, se um valor é um dentre um pequeno número de literais.
set
vence em Python 3 vstuple
,list
eor
:Resultado:
Para 3 a 5 literais,
set
ainda vence por uma ampla margem eor
se torna o mais lento.No Python 2,
set
é sempre o mais lento.or
é o mais rápido para 2 a 3 literaistuple
elist
é mais rápido com 4 ou mais literais. Eu não conseguia distinguir a velocidade dotuple
contralist
.Quando os valores a serem testados foram armazenados em cache em uma variável global fora da função, em vez de criar o literal dentro do loop,
set
sempre foram ganhos, mesmo no Python 2.Esses resultados se aplicam ao CPython de 64 bits em um Core i7.
fonte
Eu recomendaria uma implementação de conjunto em que o caso de uso seja o limite para referenciar ou procurar a existência e a implementação de tupla em que o caso de uso exige que você execute a iteração. Uma lista é uma implementação de baixo nível e requer sobrecarga significativa de memória.
fonte
Saída após comparar 10 iterações para todos os 3: Comparação
fonte
Os conjuntos são mais rápidos; além disso, você obtém mais funções com conjuntos, como digamos que você tenha dois conjuntos:
Podemos facilmente juntar dois conjuntos:
Descubra o que é comum em ambos:
Descubra o que é diferente em ambos:
E muito mais! Basta experimentá-los, eles são divertidos! Além disso, se você precisar trabalhar com os diferentes valores dentro de 2 listas ou valores comuns dentro de 2 listas, eu prefiro converter suas listas em conjuntos, e muitos programadores fazem dessa maneira. Espero que ajude você :-)
fonte