Basicamente, as listas Python são muito flexíveis e podem conter dados arbitrários completamente heterogêneos e podem ser anexados com muita eficiência, em tempo constante e amortizado . Se você precisar diminuir e aumentar sua lista com eficiência e sem problemas, eles são o caminho a percorrer. Mas eles usam um espaço muito mais do que matrizes C .
O array.array
tipo, por outro lado, é apenas um invólucro fino em matrizes C. Ele pode conter apenas dados homogêneos, todos do mesmo tipo e, portanto, usa apenas sizeof(one object) * length
bytes de memória. Principalmente, você deve usá-lo quando precisar expor uma matriz C a um ramal ou a uma chamada do sistema (por exemplo, ioctl
ou fctnl
).
array.array
também é uma maneira razoável de representar uma sequência mutável no Python 2.x ( array('B', bytes)
). No entanto, o Python 2.6+ e 3.x oferece uma sequência de bytes mutável como bytearray
.
No entanto, se você deseja fazer contas em uma matriz homogênea de dados numéricos, é muito melhor usar o NumPy, que pode vetorizar automaticamente as operações em matrizes multidimensionais complexas.
Para resumir uma longa história : array.array
é útil quando você precisa de uma matriz C homogênea de dados por outros motivos que não sejam matemática .
sizeof(element)
× (número de elementos) bytes, além de um pequeno cabeçalho fixo para sobrecarga. No entanto, o ndarray tem algumas opções avançadas para lidar com matrizes descontínuas e esparsas, e acho que algumas estratégias conectáveis para alocar memória para matrizes grandes ... alguns desses recursos avançados tornarão o usuário menos memória, enquanto outros melhorarão o desempenho usando mais memória.Para quase todos os casos, a lista normal é a escolha certa. O módulo de matrizes é mais como um invólucro fino sobre matrizes C, que fornece tipos de contêineres fortemente tipados (consulte a documentação ), com acesso a tipos mais parecidos com C, como assinados / não assinados, curtos ou duplos, que não fazem parte do tipos. Eu diria que use o módulo matrizes apenas se você realmente precisar, em todos os outros casos, fique com as listas.
fonte
array
é não significava para fazer matemática . Se você tentar o NumPyndarray
para somar uma matriz de 10 ^ 8 números, ele desaparecerá completamentelist
. O @tzot tem a ideia certa de por que o built-inarray
é lento para a matemática.O módulo array é uma daquelas coisas que você provavelmente não precisa se não souber por que o usaria (e observe que não estou tentando dizer isso de maneira condescendente!) . Na maioria das vezes, o módulo array é usado para fazer interface com o código C. Para fornecer uma resposta mais direta à sua pergunta sobre desempenho:
As matrizes são mais eficientes que as listas para alguns usos. Se você precisar alocar uma matriz que você SAIBA que não será alterada, as matrizes poderão ser mais rápidas e usar menos memória. O GvR tem uma anedota de otimização na qual o módulo do array acaba sendo o vencedor (leitura longa, mas vale a pena).
Por outro lado, parte do motivo pelo qual as listas consomem mais memória do que matrizes é porque o python alocará alguns elementos extras quando todos os elementos alocados forem usados. Isso significa que anexar itens às listas é mais rápido. Portanto, se você planeja adicionar itens, uma lista é o caminho a percorrer.
TL; DR Eu usaria apenas uma matriz se você tivesse uma necessidade excepcional de otimização ou precisas interagir com o código C (e não puder usar o pyrex ).
fonte
profissionais de cada um:
Lista
matriz (ex: matriz numpy)
fonte
Meu entendimento é que as matrizes são armazenadas com mais eficiência (ou seja, como blocos contíguos de memória vs. ponteiros para objetos Python), mas não tenho conhecimento de nenhum benefício no desempenho. Além disso, com matrizes você deve armazenar primitivas do mesmo tipo, enquanto listas podem armazenar qualquer coisa.
fonte
As matrizes da biblioteca padrão são úteis para E / S binária, como converter uma lista de ints em uma string para gravar em, por exemplo, um arquivo wave. Dito isto, como muitos já observaram, se você for fazer algum trabalho real, considere usar o NumPy.
fonte
Se você estiver usando matrizes, considere os pacotes numpy ou scipy, que oferecem matrizes com muito mais flexibilidade.
fonte
A matriz pode ser usada apenas para tipos específicos, enquanto as listas podem ser usadas para qualquer objeto.
Matrizes também podem apenas dados de um tipo, enquanto uma lista pode ter entradas de vários tipos de objetos.
Matrizes também são mais eficientes para alguns cálculos numéricos.
fonte
Uma diferença importante entre a matriz numpy e a lista é que as fatias da matriz são visualizações na matriz original. Isso significa que os dados não são copiados e quaisquer modificações na exibição serão refletidas na matriz de origem.
fonte
Esta resposta resumirá quase todas as perguntas sobre quando usar List e Array:
A principal diferença entre esses dois tipos de dados é a operação que você pode executar neles. Por exemplo, você pode dividir uma matriz por 3 e cada elemento da matriz será dividido por 3. O mesmo não pode ser feito com a lista.
A lista é parte da sintaxe do python, portanto não precisa ser declarada, enquanto você deve declarar a matriz antes de usá-la.
Você pode armazenar valores de diferentes tipos de dados em uma lista (heterogênea), enquanto na Matriz você pode armazenar apenas valores do mesmo tipo de dados (homogêneo).
As matrizes são ricas em funcionalidades e rápidas, e são amplamente usadas para operações aritméticas e para armazenar uma grande quantidade de dados - em comparação com a lista.
Matrizes consomem menos memória em comparação com listas.
fonte
Com relação ao desempenho, veja alguns números comparando listas, matrizes e matrizes python (todas com Python 3.7 em um Macbook Pro de 2017). O resultado final é que a lista python é mais rápida para essas operações.
fonte