Respuestas:
Según el código fuente , el tamaño máximo de una lista es PY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
se 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.
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.
PY_SSIZE_T_MAX
puede ser muy grande.
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
sys.maxsize
es la respuesta a la pregunta. Diferentes arquitecturas soportan diferentes máximos.
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.
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 .
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).
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 list
y dict
también, según la documentación
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.
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
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.
sizeof(PyObject*) == 4?
? ¿Qué representa esto?