Pergunta

Quais são as vantagens de NumPy sobre listas regulares do Python?

Eu tenho cerca de 100 séries dos mercados financeiros, e eu estou indo para criar uma matriz cúbica de 100x100x100 = 1 milhão de células. I será regredindo (3-variável) x cada com cada y e z, para encher a matriz com os erros padrão.

Ouvi dizer que para "grandes matrizes" eu deveria usar NumPy ao contrário de listas em Python, por razões de desempenho e escalabilidade. Coisa é, eu sei listas Python e eles parecem trabalhar para mim.

O que os benefícios se eu passar para NumPy?

E se eu tivesse Série 1000 (isto é, 1 bilhão de flutuantes células de ponto no cubo)?

Foi útil?

Solução

matrizes de Numpy são mais compactas do que as listas Python - uma lista de listas como você descreve, em Python, levaria pelo menos 20 MB ou mais, enquanto uma matriz NumPy 3D com flutuadores de precisão única nas células caberia em 4 MB. Acesso em ler e escrever itens também é mais rápido com NumPy.

Talvez você não se importa muito para apenas um milhão de células, mas você definitivamente iria para um bilhão de células - nem abordagem se encaixam em uma arquitetura de 32 bits, mas com 64-bit constrói NumPy iria fugir com 4 GB ou mais, Python só precisaria de pelo menos cerca de 12 GB (lotes de ponteiros que dobrar de tamanho!) - um pedaço mais caro muito do hardware

A diferença é principalmente devida a "indirectness" - uma lista Python é uma matriz de ponteiros de objetos Python, pelo menos 4 bytes por ponteiro além de 16 bytes para o mesmo objecto menor do Python (4 para tipo de ponteiro, 4 de referência contar, 4 para o valor - e os alocadores de memória rodadas até 16). Uma matriz NumPy é uma matriz de valores uniformes - números de precisão simples leva quatro bytes cada, mais precisão dupla, 8 bytes. Menos flexível, mas tem que pagar substancialmente a flexibilidade das listas de Python padrão!

Outras dicas

NumPy não é apenas mais eficiente; é também mais conveniente. Você ganha um monte de operações vetoriais e matriciais de graça, que às vezes permitem um para evitar trabalho desnecessário. E eles também são executados de forma eficiente.

Por exemplo, você poderia ler seu cubo diretamente de um arquivo em um array:

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

Sum ao longo da segunda dimensão:

s = x.sum(axis=1)

Encontre qual as células são acima de um limite:

(x > 0.5).nonzero()

Remova cada fatia ainda indexado ao longo da terceira dimensão:

x[:, :, ::2]

Além disso, muitas bibliotecas úteis trabalhar com arrays numpy. Por exemplo, análise e visualização de bibliotecas estatísticos.

Mesmo se você não tem problemas de desempenho, aprendendo NumPy vale a pena o esforço.

Alex mencionou a eficiência da memória, e Roberto menciona conveniência, e estes são os dois pontos positivos. Para mais algumas ideias, eu vou mencionar velocidade e funcionalidade .

A funcionalidade:? Você ganha um monte construído com NumPy, FFTs, circunvoluções, a pesquisa rápida, estatísticas básicas, álgebra linear, histogramas, etc. E realmente, quem pode viver sem FFTs

. Velocidade: Aqui está um teste em fazer uma soma sobre uma lista e uma matriz NumPy, mostrando que a soma sobre a matriz NumPy é 10x mais rápido (neste teste - milhagem pode variar)

from numpy import arange
from timeit import Timer

Nelements = 10000
Ntimeits = 10000

x = arange(Nelements)
y = range(Nelements)

t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

que em meus sistemas (enquanto eu estou executando um backup) dá:

numpy: 3.004e-05
list:  5.363e-04

Aqui está uma resposta agradável do FAQ sobre o scipy.org website :

Quais as vantagens que matrizes Numpy oferecer mais (aninhados) listas de Python?

listas do Python são recipientes de uso geral eficientes. Eles apoiam (Relativamente) eficiente de inserção, deleção, acrescentando, e concatenação, e compreensões lista do Python torná-los fáceis de construir e manipular. No entanto, eles têm certas limitações: eles não suportam “Vectorized” operações como adição e multiplicação elemento a elemento, eo fato de que eles podem conter objetos de diferentes tipos significa que Python deve armazenar informações de tipo para cada elemento e deve executar código despacho digitar quando estiver operando em cada elemento. Esta também significa que muito poucas operações de lista pode ser realizada por eficiente C laços - cada iteração exige controlos de tipo e outros Python API contabilidade.

Todos destacaram quase todas as principais diferenças entre o conjunto numpy e lista de python, eu só irá informá-los aqui:

  1. matrizes Numpy têm um tamanho fixo na criação, ao contrário de listas Python (que pode crescer dinamicamente). Alterar o tamanho da ndarray vai criar uma nova matriz e excluir o original.

  2. Os elementos em uma matriz Numpy são obrigados a ter o mesmo tipo de dados (que pode ter o tipo heterogêneo tão bem, mas que não vai vai permitir que você operações matemáticas) e, portanto, será o mesmo tamanho na memória

  3. matrizes Numpy são avanços matemáticos e outros tipos de operações em um grande número de dados facilitada. Tipicamente, tais operações são executadas de forma mais eficiente e com menos código do que é possível usando pitões construção em sequências

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top