¿Qué tan grande puede llegar a ser una lista de Python?

119

En Python, ¿qué tan grande puede ser una lista? Necesito una lista de unos 12000 elementos. ¿Seguiré siendo capaz de ejecutar métodos de lista como ordenar, etc.?

Devoto
fuente

Respuestas:

193

Según el código fuente , el tamaño máximo de una lista es PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAXse define en pyport.h como((size_t) -1)>>1

En un sistema normal de 32 bits, esto es (4294967295/2) / 4 o 536870912.

Por lo tanto, el tamaño máximo de una lista de Python en un sistema de 32 bits es 536,870,912 elementos.

Siempre que el número de elementos que tenga sea igual o inferior a éste, todas las funciones de la lista deberían funcionar correctamente.

Desconocido
fuente
4
¿Por qué es sizeof(PyObject*) == 4?? ¿Qué representa esto?
Matt
4
@Matt, es el número de bytes de un solo PyObject *. Esa cosa es lo que se llama puntero (los reconoce por el asterisco al final). Los punteros tienen 4 bytes de longitud y almacenan una dirección de memoria en el objeto asignado. Tienen "solo" 4 bytes de longitud porque con 4 bytes puedes direccionar cada elemento en la memoria de las computadoras actuales.
Antonio Ragagnin
1
Vale la pena señalar (como indica la respuesta de Álvaro Justen) que en otras máquinas, especialmente las que ejecutan sistemas de 64 bits, el valor de PY_SSIZE_T_MAXpuede ser muy grande.
ClydeTheGhost
@ClydeTheGhost, ¿podría especificar si los que ejecutan sistemas de 64 bits también pueden tener un tamaño máximo menor que los 536,870,912 elementos? ¿O que pueden variar mucho, pero siempre tienen un tamaño máximo igual o superior a 536,870,912 elementos?
al
1
@at El máximo para un sistema de 64 bits siempre será igual o mayor que para un sistema de 32 bits.
ClydeTheGhost
71

Como dice la documentación de Python :

sys.maxsize

El entero positivo más grande admitido por el tipo Py_ssize_t de la plataforma y, por lo tanto, el tamaño máximo que pueden tener las listas, cadenas, dictados y muchos otros contenedores.

En mi computadora (Linux x86_64):

>>> import sys
>>> print sys.maxsize
9223372036854775807
Álvaro Justen
fuente
¿Cómo responde esto a la pregunta
Idgorman
11
@ldgorman, sys.maxsizees la respuesta a la pregunta. Diferentes arquitecturas soportan diferentes máximos.
Simon Kuang
2
9223372036854775807 elementos? De Verdad? Esto también varía mucho de la respuesta más votada.
Akki
13
@akki, la respuesta aceptada se refiere a un sistema de 32 bits. Dado que es 2016, asumiré que está en un sistema de 64 bits y, por lo tanto, la respuesta es correcta
Brian Leach
2
Esta debe ser la respuesta seleccionada.
Lokesh
26

Seguro que está bien. De hecho, puedes comprobarlo por ti mismo fácilmente:

l = range(12000)
l = sorted(l, reverse=True)

Ejecutar esas líneas en mi máquina tomó:

real    0m0.036s
user    0m0.024s
sys  0m0.004s

Pero claro, como decían todos los demás. Cuanto mayor sea la matriz, más lentas serán las operaciones.

Nadia Alramli
fuente
20
El tiempo de esta manera puede ser engañoso: la mayor parte del tiempo se dedica a iniciar el intérprete de Python. Una mejor manera es: python -m timeit.py "l = rango (12000); l = ordenado (l, reverse = True)". En mi máquina, esto da aproximadamente la vigésima parte del tiempo para este ejemplo.
dF.
5
@dF, tiene razón sobre la precisión. Gracias por notar eso. Solo quería probar un punto. Y el ejemplo lo prueba.
Nadia Alramli
13
@dF: ¡Impresionante! 0.024s fue demasiado tiempo para mí y me alegro de poder dejar de preocuparme por eso ahora.
Thomas Edleson
6

En código casual he creado listas con millones de elementos. Creo que la implementación de listas de Python solo está limitada por la cantidad de memoria en su sistema.

Además, los métodos / funciones de la lista deberían seguir funcionando a pesar del tamaño de la lista.

Si le preocupa el rendimiento, podría valer la pena buscar en una biblioteca como NumPy .

Doug
fuente
5

Las características de rendimiento de las listas se describen en Effbot.

Las listas de Python en realidad se implementan como vectores para un acceso aleatorio rápido, por lo que el contenedor básicamente contendrá tantos elementos como haya espacio en la memoria. (Necesita espacio para los punteros contenidos en la lista, así como espacio en la memoria para los objetos a los que se apunta).

Agregar es O(1)(complejidad constante amortizada), sin embargo, insertar / eliminar desde la mitad de la secuencia requerirá un O(n)reordenamiento (complejidad lineal), que se volverá más lento a medida que el número de elementos en su lista.

Su pregunta de clasificación tiene más matices, ya que la operación de comparación puede llevar una cantidad ilimitada de tiempo. Si está realizando comparaciones realmente lentas, tomará mucho tiempo, aunque no es culpa del tipo de datos de lista de Python .

La inversión solo toma la cantidad de tiempo que se requiere para intercambiar todos los punteros de la lista (necesariamente O(n)(complejidad lineal), ya que toca cada puntero una vez).

cdleary
fuente
4

12000 elementos no es nada en Python ... y en realidad la cantidad de elementos puede llegar hasta donde el intérprete de Python tenga memoria en su sistema.

AlbertoPL
fuente
3

Varía para diferentes sistemas (depende de la RAM). La forma más sencilla de averiguarlo es

import six six.MAXSIZE 9223372036854775807 Esto da el tamaño máximo de listy dicttambién, según la documentación

Yunus
fuente
1
esa no es la documentación
Boris
1

Yo diría que solo está limitado por la cantidad total de RAM disponible. Obviamente, cuanto más grande sea la matriz, más largas serán las operaciones.

Wayne Koorts
fuente
4
Generalmente es cierto, pero no todos: la adición permanece amortizada en un tiempo constante independientemente del tamaño de la matriz.
cdleary
0

Obtuve esto desde aquí en un sistema de x64 bits: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 de mayo de 2018, 01:54:01) [MSC v.1913 64 bit (AMD64)] en win32

ingrese la descripción de la imagen aquí

usuario2063329
fuente
1
Esta sería una gran respuesta si ampliara un poco los detalles y cómo otros podrían encontrar su propio límite.
Shayaan
-16

No hay limitación de número de lista. La razón principal que causa su error es la RAM. Actualice el tamaño de su memoria.

Haimei
fuente
9
-1 porque en realidad no responde la pregunta, y en realidad es engañoso porque (como se muestra en otras respuestas) la lista tiene un tamaño máximo.
ClydeTheGhost