¿Python es más eficiente en el espacio que la lista?

Se sabe que la list se inicializa con una gran cantidad de espacio para optimizar el tiempo necesario para expandir la lista (en promedio, no tenemos que seguir haciendo una nueva lista como una matriz).

¿Qué hay de set ?

La siguiente construcción hace que el espacio se desperdicie debido a la list . Entiendo que la tuple ahorra más espacio porque es inmutable. ¿Podemos hacer lo mismo para set y todavía mutables?

set( [ 1, 2, 3] )

 >>> from sys import getsizeof as size >>> s = set(xrange(100)) >>> l = list(xrange(100)) >>> size(s) 8424 >>> size(l) 1016 

set s ocupa más memoria que la list s. Algunas de las funciones que ofrecen los set requieren más memoria (por ejemplo, pruebas rápidas de membresía).

Parece que para listas pequeñas, los conjuntos pueden ocupar hasta 10 veces más memoria, pero en listas más grandes esto se reduce a alrededor de 3 veces por alguna razón. (Tal vez de las colisiones de tablas hash que resultan en un encadenamiento de listas vinculadas, lo que ralentizaría la búsqueda, pero ¿ayudaría al uso de la memoria?)

En python3, getsizeof (range ()) siempre devuelve una constante porque los objetos de rango son algo así como iteradores, así que probé esto haciendo las listas reales.

 from sys import getsizeof # returns memory size in bytes list_lengths = [100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000] # from 100 to 1billion for length in list_lengths: my_list = [num for num in range(length)] my_set = set(my_list) print("list length: {}".format(len(my_list))) print("memory size of my_list: {}".format(getsizeof(my_list))) print("memory size of my_set: {}".format(getsizeof(my_set))) print("set to list size ratio: {}".format(getsizeof(my_set)/getsizeof(my_list))) Output: list length: 100 memory size of my_list: 912 memory size of my_set: 8416 set to list size ratio: 9.228070175438596 list length: 1000 memory size of my_list: 9024 memory size of my_set: 32992 set to list size ratio: 3.6560283687943262 list length: 10000 memory size of my_list: 87624 memory size of my_set: 524512 set to list size ratio: 5.985939925134666 list length: 100000 memory size of my_list: 824464 memory size of my_set: 4194528 set to list size ratio: 5.087581750082478 list length: 1000000 memory size of my_list: 8697464 memory size of my_set: 33554656 set to list size ratio: 3.8579815909557085 list length: 10000000 memory size of my_list: 81528056 memory size of my_set: 268435680 set to list size ratio: 3.2925558779421897 list length: 100000000 memory size of my_list: 859724472 memory size of my_set: 4294967520 set to list size ratio: 4.995748824048828 list length: 1000000000 memory size of my_list: 8058558880 memory size of my_set: 34359738592 # my computer doesn't have this much memory, not sure what's going on here. Maybe it's writing to SSD set to list size ratio: 4.263757218089594