He estado tratando de aplicar un algoritmo para reducir una lista de python a una más pequeña en función de ciertos criterios. Debido al gran volumen de la lista original, en el orden de 100 mil elementos, traté de itertools para evitar múltiples asignaciones de memoria por lo que se me ocurrió esto:itertools.islice en comparación con el segmento de lista
reducedVec = [ 'F' if sum(1 for x in islice(vec, i, i+ratio) if x == 'F')
> ratio/3.0 else 'T'
for i in xrange(0, len(vec), ratio) ]
Tiempo de ejecución para esta toma una preocupante mucho tiempo en el orden de unos minutos, cuando vec tiene alrededor de 100k elementos. Cuando lo intenté en su lugar:
reducedVec = [ 'F' if sum(1 for x in vec[i:i+ratio] if x == 'F')
> ratio/3.0 else 'T'
for i in xrange(0, len(vec), ratio) ]
en esencia reemplazar islice con una rebanada, la ejecución es instantánea.
¿Puedes pensar en una explicación plausible para esto? Hubiera pensado que evitar asignar repetidamente una nueva lista con una cantidad sustancial de elementos me ahorraría unos pocos ciclos computacionales en lugar de paralizar toda la ejecución.
Cheers, Themis
¿Qué pasa con el uso de '' vec.count ("F", i, i + cociente) '' en lugar de '' suma (1 para x en vec [i: i + ratio] si x == 'F') ''? Lo hace más legible en mi opinión y probablemente más rápido también. –