Qual o tamanho de uma lista Python?

119

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?

Devotado
fonte

Respostas:

193

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.

Desconhecido
fonte
4
Porque é sizeof(PyObject*) == 4?? O que isso representa?
Matt
4
@Matt, é o número de bytes de um único 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.
Antonio Ragagnin
1
É importante notar (como indica a resposta de Álvaro Justen) que em outras máquinas, notadamente aquelas que rodam sistemas de 64 bits, o valor de PY_SSIZE_T_MAXpode muito grande.
ClydeTheGhost
@ClydeTheGhost, você poderia especificar se aqueles que executam sistemas de 64 bits também podem ter um tamanho máximo menor do que 536.870.912 elementos? Ou que eles podem variar muito, mas sempre têm um tamanho máximo que é igual ou maior que 536.870.912 elementos?
em
1
@at O máximo para um sistema de 64 bits será sempre igual ou maior do que para um sistema de 32 bits.
ClydeTheGhost
71

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
Álvaro Justen
fonte
como isso responde à pergunta
ldgorman
11
@ldgorman, sys.maxsizeé a resposta à pergunta. Diferentes arquiteturas suportam diferentes máximos.
Simon Kuang
2
9223372036854775807 elementos? Realmente? Isso também varia muito da resposta mais votada.
akki
13
@akki, a resposta aceita se refere a um sistema de 32 bits. Como estamos em 2016, presumirei que você está em um sistema de 64 bits e que a resposta está correta
Brian Leach
2
Esta deve ser a resposta selecionada.
Lokesh de
26

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.

Nadia Alramli
fonte
20
O tempo dessa maneira pode ser enganoso - a maior parte do tempo é gasta inicializando o interpretador Python. A melhor maneira é: python -m timeit.py "l = intervalo (12000); l = classificado (l, reverso = Verdadeiro)". Na minha máquina, isso dá cerca de 1/20 do tempo para este exemplo.
dF.
5
@dF, você está certo sobre a precisão. Obrigado por notar isso. Eu só queria provar um ponto. E o exemplo prova isso.
Nadia Alramli
13
@dF: Incrível! 0.024s era muito tempo para mim e estou feliz por poder parar de me preocupar com isso agora.
Thomas Edleson
6

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 .

Doug
fonte
5

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).

cdleary
fonte
4

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.

AlbertoPL
fonte
3

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 liste dicttambém, de acordo com a documentação

yunus
fonte
1
essa não é a documentação
Boris
1

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.

Wayne Koorts
fonte
4
Geralmente verdade, mas não todos eles - o acréscimo permanece constante amortizado tempo independente do tamanho da matriz.
cdleary
0

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

insira a descrição da imagem aqui

user2063329
fonte
1
Esta seria uma ótima resposta se você expandisse um pouco os detalhes e como os outros poderiam encontrar seus próprios limites.
Shayaan
-16

Não há limitação de número de lista. O principal motivo do erro é a RAM. Atualize o tamanho da sua memória.

Haimei
fonte
9
-1 porque na verdade não responde à pergunta e é realmente enganoso porque (como mostrado por outras respostas) a lista de fato tem um tamanho máximo.
ClydeTheGhost