Respostas:
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.
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
O maior inteiro positivo suportado pelo tipo Py_ssize_t da plataforma e, portanto, as listas de tamanho máximo, strings, dicts e muitos outros contêineres podem ter.
Em meu computador (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
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:
l = range(12000)
l = sorted(l, reverse=True)
Executar essas linhas em minha máquina levou:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
Mas com certeza, como todo mundo disse. Quanto maior a matriz, mais lentas serão as operações.
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 .
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á uma O(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).
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 de list
e dict
também, de acordo com a documentação
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.
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
Não há limitação de número de lista. O principal motivo do erro é a RAM. Atualize o tamanho da sua memória.
sizeof(PyObject*) == 4?
? O que isso representa?