Diferenças entre as funções Extend, Append e Insert da lista. (Python)

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:

  1. Criei a lista l_1 com 10.000 elementos (zero a 9.999);
  2. Para todas as operações, o objetivo era adicionar mais 10.000 elementos (números 10.000 a 19.999) a lista l_1;
  3. Repeti uma das operações (append, insert, extend e concatenação de listas) 1000 vezes;
  4. 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!

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , , .