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.?
119
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.
sizeof(PyObject*) == 4?
? ¿Qué representa esto?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
En mi computadora (Linux x86_64):
fuente
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:
Ejecutar esas líneas en mi máquina tomó:
Pero claro, como decían todos los demás. Cuanto mayor sea la matriz, más lentas serán las operaciones.
fuente
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 .
fuente
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á unO(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).fuente
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.
fuente
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 delist
ydict
también, según la documentaciónfuente
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.
fuente
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
fuente
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.
fuente