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?

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.


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

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.


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 .


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


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.


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


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.


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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.