Existe alguma diferença de desempenho entre tuplas e listas quando se trata de instanciação e recuperação de elementos?
python
performance
list
tuples
python-internals
Somente leitura
fonte
fonte
Respostas:
O
dis
módulo desmonta o código de bytes para uma função e é útil para ver a diferença entre tuplas e listas.Nesse caso, você pode ver que acessar um elemento gera código idêntico, mas que atribuir uma tupla é muito mais rápido do que atribuir uma lista.
fonte
ListLike
com uma__getitem__
que faça algo terrivelmente lento e depois desmontex = ListLike((1, 2, 3, 4, 5)); y = x[2]
. O bytecode será mais parecido com o exemplo da tupla acima do que o exemplo da lista, mas você realmente acredita que isso significa que o desempenho será semelhante?Em geral, você pode esperar que as tuplas sejam um pouco mais rápidas. No entanto, você definitivamente deve testar seu caso específico (se a diferença puder afetar o desempenho do seu programa - lembre-se de que "a otimização prematura é a raiz de todo mal").
O Python facilita isso: o timeit é seu amigo.
e...
Portanto, nesse caso, a instanciação é quase uma ordem de magnitude mais rápida para a tupla, mas o acesso ao item é realmente um pouco mais rápido para a lista! Portanto, se você estiver criando algumas tuplas e acessando-as muitas vezes, pode ser mais rápido usar as listas.
Obviamente, se você quiser alterar um item, a lista será definitivamente mais rápida, pois você precisará criar uma nova tupla inteira para alterar um item (já que as tuplas são imutáveis).
fonte
python -m timeit "x=tuple(xrange(999999))"
vspython -m timeit "x=list(xrange(999999))"
. Como seria de esperar, leva um pouco mais de tempo para materializar uma tupla do que uma lista.-s "SETUP_CODE"
é executado antes do código cronometrado real.Resumo
As tuplas tendem a ter um desempenho melhor do que as listas em quase todas as categorias:
1) As tuplas podem ser dobradas constantemente .
2) As tuplas podem ser reutilizadas em vez de copiadas.
3) As tuplas são compactas e não superalocam.
4) Tuplas referenciam diretamente seus elementos.
As tuplas podem ser dobradas constantemente
Tuplas de constantes podem ser pré-computadas pelo otimizador de olho mágico do Python ou pelo otimizador AST. As listas, por outro lado, são criadas do zero:
Tuplas não precisam ser copiadas
A execução
tuple(some_tuple)
retorna imediatamente a si mesma. Como as tuplas são imutáveis, elas não precisam ser copiadas:Por outro lado,
list(some_list)
exige que todos os dados sejam copiados para uma nova lista:Tuplas não superalocam
Como o tamanho de uma tupla é fixo, ele pode ser armazenado de forma mais compacta do que as listas que precisam ser superalocadas para tornar eficientes as operações append () .
Isso dá às tuplas uma boa vantagem de espaço:
Aqui está o comentário de Objects / listobject.c que explica o que as listas estão fazendo:
Tuplas se referem diretamente a seus elementos
Referências a objetos são incorporadas diretamente em um objeto de tupla. Por outro lado, as listas têm uma camada extra de indireção para uma matriz externa de ponteiros.
Isso fornece às tuplas uma pequena vantagem de velocidade para pesquisas indexadas e descompactação:
Aqui está como a tupla
(10, 20)
é armazenada:Aqui está como a lista
[10, 20]
é armazenada:Observe que o objeto tupla incorpora os dois ponteiros de dados diretamente, enquanto o objeto de lista possui uma camada adicional de indireção a uma matriz externa que contém os dois ponteiros de dados.
fonte
Internally, tuples are stored a little more efficiently than lists, and also tuples can be accessed slightly faster.
Como você poderia explicar os resultados da resposta da dF.tuple(some_tuple)
somente retorna asome_tuple
si próprio sesome_tuple
for lavável - quando seu conteúdo for recursivamente imutável e lavável. Caso contrário,tuple(some_tuple)
retorna uma nova tupla. Por exemplo, quandosome_tuple
contém itens mutáveis.As tuplas, sendo imutáveis, são mais eficientes em termos de memória; lista, por eficiência, atribui um total de memória à memória para permitir anexos sem
realloc
s constante . Portanto, se você deseja percorrer uma sequência constante de valores em seu código (por exemplofor direction in 'up', 'right', 'down', 'left':
), as tuplas são preferidas, pois essas tuplas são pré-calculadas em tempo de compilação.As velocidades de acesso devem ser as mesmas (ambas são armazenadas como matrizes contíguas na memória).
Mas,
alist.append(item)
é muito preferidoatuple+= (item,)
quando você lida com dados mutáveis. Lembre-se de que as tuplas devem ser tratadas como registros sem nomes de campos.fonte
Você também deve considerar o
array
módulo na biblioteca padrão se todos os itens em sua lista ou tupla forem do mesmo tipo C. Vai demorar menos memória e pode ser mais rápido.fonte
Aqui está outra pequena referência, apenas por uma questão ..
Vamos calcular a média:
Você pode chamar isso de quase inconclusivo.
Mas, com certeza, as tuplas gastaram
101.239%
tempo ou1.239%
tempo extra para fazer o trabalho em comparação com as listas.fonte
As tuplas devem ser um pouco mais eficientes e, por isso, mais rápidas do que as listas, porque são imutáveis.
fonte
A principal razão para a Tuple ser muito eficiente na leitura é porque é imutável.
Por que objetos imutáveis são fáceis de ler?
O motivo é que as tuplas podem ser armazenadas no cache da memória, ao contrário das listas. O programa sempre lê a partir da localização da memória da lista, pois é mutável (pode mudar a qualquer momento).
fonte