2009-05-12 21 views

Respuesta

149

De acuerdo con source code, el tamaño máximo de una lista es PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAX se define en pyport.h ser ((size_t) -1)>>1

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

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

Siempre que la cantidad de elementos que tenga sea igual o inferior a esta, todas las funciones de la lista deberían funcionar correctamente.

+2

¿Por qué 'sizeof (PyObject *) == 4?'? ¿Qué representa esto? – Matt

+3

@Matt, es el número de bytes de un solo 'PyObject *'. Esa cosa es un puntero llamado (los reconoces por el asterisco al final). Los punteros tienen una longitud de 4 bytes y almacenan una dirección de memoria para el objeto asignado. Son "solo" de 4 bytes de longitud porque con 4 bytes puede abordar cada elemento en una memoria de las computadoras de hoy en día. –

+0

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_MAX' puede ser muy grande. –

4

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

1

Diría que solo está limitado por la cantidad total de RAM disponible. Obviamente, cuanto mayor sea el conjunto, más operaciones durará.

+3

Generalmente cierto, pero no todos ellos, los restos añadidos se amortizan a tiempo constante independientemente del tamaño de la matriz. – cdleary

+0

Interesante, gracias por el comentario. –

24

Seguro, está bien. En realidad se puede ver por sí mismo fácilmente:

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

Ejecución de los esas líneas en mi máquina tomó:

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

Pero seguro que todos los demás dijeron. Cuanto más grande sea la matriz, más lentas serán las operaciones.

+15

La sincronización de este modo puede ser engañosa; la mayor parte del tiempo se emplea para iniciar el intérprete de Python. Una mejor manera es: python -m timeit.py "l = range (12000); l = ordenado (l, reverse = True)". En mi máquina, esto da aproximadamente 1/20 de las veces para este ejemplo. –

+3

@dF, tiene razón acerca de la precisión. Gracias por notar eso. Solo quería demostrar un punto. Y el ejemplo lo demuestra. –

+8

@dF: ¡Impresionante! 0.024s fue demasiado tiempo para mí y me alegro de poder dejar de preocuparme por eso ahora. –

6

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

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

Si le importa el rendimiento, puede valer la pena consultar una biblioteca como NumPy.

5

Performance characteristics for lists se describen en Effbot.

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

Adjuntar es O(1) (complejidad constante amortizada), sin embargo, insertar en/borrar desde el medio de la secuencia requerirá un reordenamiento O(n) (complejidad lineal), que se volverá más lenta a medida que la cantidad de elementos en su lista.

Su pregunta de clasificación tiene más matices, ya que la operación de comparación puede llevar un tiempo ilimitado. Si está realizando comparaciones realmente lentas, llevará mucho tiempo, aunque no es culpa de Python's list data type.

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

31

Como el Python documentation says:

sys.maxsize

El número entero positivo más grande soportado por tipo Py_ssize_t de la plataforma, y ​​por lo tanto las listas de tamaño máximo, secuencias, Dicts, y muchos otros contenedores pueden tener.

En mi equipo (Linux x86_64):

>>> import sys 
>>> print sys.maxsize 
9223372036854775807 
+0

cómo responde esto a la pregunta – ldgorman

+3

@ ldgorman, 'sys.maxsize' es la respuesta a la pregunta. Diferentes arquitecturas admiten diferentes máximos. –

+0

¿El valor devuelto por sys.maxsize refleja la cantidad de RAM disponible en la computadora de alguna manera? – GeoJohn

-8

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

+1

-1 porque en realidad no responde la pregunta, y en realidad es engañosa porque (como se muestra en otras respuestas) la lista sí tiene un talla máxima. –

Cuestiones relacionadas