Estoy creando una clase con un diccionario con claves enteras y valores de lista, entre otros. Sin embargo, agregar valores a este diccionario parece ser un cuello de botella real y me preguntaba si podría haber algún modo de acelerar mi código.Python: forma óptima de agregar al diccionario los valores de la lista
class myClass():
def __init__(self):
self.d = defaultdict(list)
def addValue(self, index, value):
self.d[index].append(value)
¿Es esta la mejor manera de hacerlo? Realmente no me importa el orden de los valores, así que tal vez haya una estructura de datos más adecuada con un apéndice más rápido. Por otra parte, 'append' no parece ser el problema principal, porque si simplemente anexo a una lista vacía, el código es mucho más rápido. Supongo que es la carga de la lista previamente almacenada la que ocupa la mayor parte del tiempo.
descubrí que el problema no está en el dict, pero en la lista de adición (a pesar de que se reivindique lo contrario en mi post original, por lo que pido disculpas). Este problema se debe a un error en el recolector de basura de Python, que está bien explicado en this other question. Desactivar el gc antes de agregar todos los valores y luego volver a habilitarlo, ¡acelera enormemente el proceso!
Agregar elementos a una lista y obtener valores de un objeto o un dict no demoran nada. Para acelerar un programa, se encuentra el cuello de botella mediante el perfil, no cambiando piezas de código aleatorias. –
¿Es mucho más rápido asignar elementos a claves existentes que agregar valores a claves nuevas? –
Acabo de enterarme de que el problema no está en el dict, sino en la lista anexada (aunque afirmé lo contrario en mi publicación original, por la que me disculpo). Luego encontré la respuesta a mi pregunta en http://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressively-slower. Como soy nuevo en este sitio, no sé cuál es el procedimiento estándar en este caso: ¿debo eliminar mi publicación original? ¿O agregar los detalles anteriores y responder a la publicación? – niefpaarschoenen