Em Python, quão grande pode ser uma lista? Preciso de uma lista de cerca de 12.000 elementos. Ainda poderei executar métodos de lista, como classificação, etc?
119
De acordo com o código-fonte , o tamanho máximo de uma lista éPY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
é definido em pyport.h como sendo((size_t) -1)>>1
Em um sistema normal de 32 bits, é (4294967295/2) / 4 ou 536870912.
Portanto, o tamanho máximo de uma lista python em um sistema de 32 bits é 536.870.912 elementos.
Contanto que o número de elementos que você possui seja igual ou inferior, todas as funções da lista devem operar corretamente.
sizeof(PyObject*) == 4?
? O que isso representa?PyObject *
. Essa coisa é chamada de ponteiro (você os reconhece por causa do asterisco no final). Os ponteiros têm 4 bytes de comprimento e armazenam um endereço de memória para o objeto alocado. Eles têm "apenas" 4 bytes de comprimento porque com 4 bytes você pode endereçar todos os elementos em uma memória dos computadores atuais.PY_SSIZE_T_MAX
pode muito grande.Como diz a documentação do Python :
sys.maxsize
Em meu computador (Linux x86_64):
fonte
sys.maxsize
é a resposta à pergunta. Diferentes arquiteturas suportam diferentes máximos.Claro que está tudo bem. Na verdade, você pode ver por si mesmo facilmente:
Executar essas linhas em minha máquina levou:
Mas com certeza, como todo mundo disse. Quanto maior a matriz, mais lentas serão as operações.
fonte
No código casual, criei listas com milhões de elementos. Eu acredito que a implementação de listas em Python é limitada apenas pela quantidade de memória em seu sistema.
Além disso, os métodos / funções da lista devem continuar a funcionar, apesar do tamanho da lista.
Se você se preocupa com o desempenho, pode valer a pena examinar uma biblioteca como a NumPy .
fonte
As características de desempenho das listas são descritas no Effbot.
As listas Python são, na verdade, implementadas como vetor para acesso aleatório rápido, de modo que o contêiner irá basicamente armazenar tantos itens quanto houver espaço na memória. (Você precisa de espaço para os ponteiros contidos na lista, bem como espaço na memória para o (s) objeto (s) sendo apontado (s).)
Anexar é
O(1)
(complexidade constante amortizada), no entanto, inserir / excluir do meio da sequência exigirá umaO(n)
reordenação (complexidade linear), que ficará mais lenta conforme o número de elementos em sua lista.Sua pergunta de classificação tem mais nuances, pois a operação de comparação pode levar um tempo ilimitado. Se você estiver realizando comparações realmente lentas, levará muito tempo, embora não seja culpa do tipo de dados de lista do Python .
A reversão leva apenas o tempo necessário para trocar todos os ponteiros na lista (necessariamente
O(n)
(complexidade linear), já que você toca em cada ponteiro uma vez).fonte
12000 elementos não é nada em Python ... e na verdade o número de elementos pode ir tão longe quanto o interpretador Python tem memória em seu sistema.
fonte
Isso varia para diferentes sistemas (depende da RAM). A maneira mais fácil de descobrir é
import six six.MAXSIZE 9223372036854775807
Isso dá o tamanho máximo delist
edict
também, de acordo com a documentaçãofonte
Eu diria que você está limitado apenas pela quantidade total de RAM disponível. Obviamente, quanto maior for o array, mais demoradas serão as operações nele.
fonte
Consegui isso aqui em um sistema de 64 bits: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 de maio de 2018, 01:54:01) [MSC v.1913 64 bits (AMD64)] no win32
fonte
Não há limitação de número de lista. O principal motivo do erro é a RAM. Atualize o tamanho da sua memória.
fonte