Diferenças entre as funções Extend, Append e Insert da lista. (Python)
Overview
Neste post descontraído, mas bastante informativo, vou guiar você pelas curiosidades e potenciais das funções insert, extend e append de listas em Python. Vamos explorar exemplos claros para dominar essas habilidades essenciais e também mergulhar em uma análise leve de performance para saciar a curiosidade dos mais aventureiros em otimização de código. Preparado? Vamos lá!
A lista do Python possui uma série de funções, dentre elas a insert, extend e append. Neste post vou falar um pouco sobre o funcionamento delas e mostrar alguns exemplos.
Definições
- Append: Insere um item no final da lista.
- Insert: Adiciona um item em uma posição X da lista e empurra os itens depois da posição X para “baixo”;
- Extend: “Mescla” duas listas, fazendo com que passe a existir apenas uma, com todos os elementos;
Exemplos
Append
>>> l_1 = [1,2,3,4,5]
>>> l_1.append(42)
>>> print(l_1)
[1, 2, 3, 4, 5, 42]
No código acima, primeiro declaro uma lista com os elementos 1, 2, 3, 4 e 5, depois adiciono um item ao final dela (append).
É importante falar que o append é utilizado para incluir apenas 1 item por vez. Se você utilizar a função append e passar outra lista ou um tuple, a lista/tuple vai ser inserida na lista original como se fosse um único elemento. Exemplo:
>>> l_1 = [1,2,3,4,5]
>>> l_1.append([42, 43])
>>> print(l_1)
[1, 2, 3, 4, 5, [42, 43]]
No fonte acima, percebemos que a lista [42, 43] foi adicionar a lista l_1, mas como um elemento. Ela não foi “mesclada” a lista original.
Se você quiser adicionar vários itens de uma vez ao final da lista, tem duas opções: fazer um loop e chamar o append varias vezes (uma para cada item) ou utilizar a função extend.
Extend
>>> l_1 = [1,2,3,4,5]
>>> l_2 = [6,7,8,9,10]
>>> l_1.extend(l_2)
>>> print(l_1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
No código acima, declaramos duas listas e depois utilizamos a função extend para “mesclar” as duas. Você consegue o mesmo resultado somando (concatenando) as duas listas. A diferença entre as duas formas é que a função extend altera a lista original, adicionando os novos elementos e a concatenação de listas gera uma terceira lista com todos os elementos.
Insert
O insert é muito parecido com o append. Ele insere um item em uma lista, mas o item inserido vai para a posição indicada.
>>> l_1 = [1,2,3,4,5]
>>> l_1.insert(1, "bacon")
>>> print(l_1)
[1, 'bacon', 2, 3, 4, 5]
No código acima, declarei a lista l_1 e inseri (insert) o elemento bacon na posição 1.
Performance
Para fazer uma analise rápida de performance, fiz o seguinte teste:
- Criei a lista l_1 com 10.000 elementos (zero a 9.999);
- Para todas as operações, o objetivo era adicionar mais 10.000 elementos (números 10.000 a 19.999) a lista l_1;
- Repeti uma das operações (append, insert, extend e concatenação de listas) 1000 vezes;
- Para cada operação, repetir o passo anterior 10 vezes;
Utilizei a biblioteca timeit para medir os tempos e o resultado foi:
- Append: 4.94 ms (média de 266 microsegundos por loop);
- Insert: 199 ms (média de 40.7 microsegundos por loop);
- Extend: 1.07 ms (média de 52.2 microsegundos por loop);
- Concatenar listas: 1.52 ms (média de 216 microsegundos por loop);
De acordo com estes testes, utilizar extend é melhor que concatenar listas e o append é melhor que o insert. Quando digo melhor, estou falando em termos de performance.
Utilizei um notebook do Jupyter para realizar este teste e o insert demorou muito para concluir. Então mudei os parâmetros dele para fazer apenas 1 loop ao invés de 1000, mas mantive as 10 repetições. Pelo tipo de comportamento do insert, faz sentido que a operação seja mais demorada e por isso resolvi deixar o resultado dele (mesmo com parâmetros diferentes) para que você possa ter uma ideia da magnitude da diferença de performance destas operações.
Importante: não tome este este teste como verdade absoluta. Eles não foram feitos utilizando padrões científicos apurados e dizem que o timeit, quando utilizado via Jupyter é bem lento.
Sugiro que você faça seus próprios testes de performance quando for utilizar estas funções de forma mais intensa.
Espero ter ajudado!