<div class="gmail_quote">El 4 de marzo de 2010 16:27, Olemis Lang (Simelix) <span dir="ltr"><<a href="mailto:olemis%2Bpy@gmail.com">olemis+py@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
2010/3/4 Arnau Sanchez <<a href="mailto:pyarnau@gmail.com">pyarnau@gmail.com</a>>:<br>
<div class="im">> On 04/03/10 14:02, Pablo Angulo wrote:<br>
><br>
>> indices = []<br>
>> ultimo = 0<br>
>> for v in subconjunto:<br>
>> ultimo += conjunto.index(v,ultimo)<br>
>> indices.append(ultimo)<br>
><br>
> Creo que el += sobra, list.index() devuelve el índice absoluto:<br>
><br>
> ultimo = conjunto.index(v, ultimo)<br>
><br>
> Y si no me equivoco el índice podría ser ultimo+1. Con tu propuesta, y<br>
> usando generadores queda realmente simple:<br>
><br>
> ultimo = -1<br>
> for v in subconjunto:<br>
> ultimo = conjunto.index(v, ultimo+1)<br>
> yield ultimo<br>
<br>
</div>Aquí por ejemplo hay un caso que ilustra el hecho de no confiar<br>
demasiado en las estimaciones teóricas . Las estimaciones de Pablo et<br>
al se pueden ver afectadas por la eficiencia de la implementación del<br>
método index (el cual no me parece que sea muy O(1) que digamos, pero<br>
no tengo los detalles en la mano ...) . E.g. si fuera O(n), O(log(n))<br>
... en el peor caso entonces todos los análisis anteriores no serían<br>
del todo precisos (CMIIW)<br>
<br>
PD: JFYI, la implementación que envié anteriormente no sufre de este<br>
potencial problema (de todas formas sería bueno saber si `index` es<br>
O(1) o no ;o)<br>
<div class="im"><br>
--<br>
Regards,<br>
<br>
Olemis<br></div></blockquote><div><br>Después de leeros a todos (muchas gracias, Juan Ignacio, Daniel, Pablo, Olemis y Arnau) he hecho unas pruebas para un caso que se acerca a lo que necesito:<br><br>from datetime import datetime, timedelta<br>
import bisect<br>import time<br><br>def generador(start, end, intervalo):<br> fechas = []<br> while start <= end:<br> fechas.append(start)<br> start += timedelta(minutes=intervalo)<br> return [valores for valores in fechas]<br>
<br>start = datetime(1900,1,1,0,0)<br>end = datetime(1901,1,1,0,0)<br><br>conjunto = generador(start, end, 10)<br>subconjunto = generador (start, end, 30)<br><br><br>t0 = time.time()<br>indices = []<br>ultimo = -1<br>for i in subconjunto:<br>
ultimo = conjunto.index(i, ultimo+1)<br> indices.append(ultimo)<br> #yield ultimo<br>print time.time() - t0<br>print indices[0:25]<br><br>t0 = time.time()<br>indices1 = [conjunto.index(i) for i in subconjunto]<br>
print time.time() - t0<br>print indices1[0:25]<br><br>t0 = time.time()<br>indices2 = [bisect.bisect(conjunto, i) for i in subconjunto]<br>print time.time() - t0<br>print indices2[0:25]<br><br>El yield me da error tal como lo he puesto ¿?.<br>
<br>Las salidas que obtengo son:<br><br>tiempo de la primera opción: 0.0149998664856<br>for i in subconjunto:<br>
ultimo = conjunto.index(i, ultimo+1)<br>
indices.append(ultimo)<br>Los primero 25 valores de indices = [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72]<br><br>tiempo de mi opción, la original: 41.2180001736<br>
indices1 = [conjunto.index(i) for i in subconjunto]<br>Los primero 25 valores de indices1 = [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72]<br><br>tiempo de la tercera opción: 0.0469999313354<br>
indices2 = [bisect.bisect(conjunto, i) for i in subconjunto]<br>Los primero 25 valores de indices2 = [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73]<br><br>Menos mal que he preguntado a los expertos.<br>
<br>Muchas gracias por las mejoras. Tanto la primera opción como la tercera son infinitamente mejores que la mía y aceptables en tiempo usado.<br></div></div>