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

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:

  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!