Itertools.product buiding resultados intermedios en la memoria?

llpinokio:

Tengo el siguiente código

from itertools import product
from time import sleep
def slowrange(n,t):
        for i in range(n):
                sleep(t)
                yield i

for n,w in product(slowrange(5,0.2),"AB"):
        print(n,w)

ya que en el documento itertools.product dice que:

Esta función es más o menos equivalente al código siguiente, salvo que la ejecución real no se acumula los resultados intermedios en la memoria

me esperaba que iba a ver dos líneas con 0 A \n 0 Ba continuación, 0,2 segundos más tarde me gustaría ver la siguiente iteración, sin embargo, que no se produce, después de 1s se imprimen todas las iteraciones, si yo uso la siguiente función en lugar de itertools.product, lo hace realizar el comportamiento deseado:

def product(itertor1,iterator2):
        for s in iterator1:
                for f in iterator2:
                        yield s,f

Por lo tanto, lo que está pasando ?, ¿es esto un error ?, es algo malo en la documentación?

Martijn Pieters:

Los resultados intermedios no se construyen en la memoria, no. Que se hace referencia a esta parte en el código Python:

result = [[]]
for pool in pools:
    result = [x+[y] for x in result for y in pool]

Lo que no sucederá es que los iteradores de entrada se convierten a tuplas en una piscina, las primeras líneas:

pools = [tuple(pool) for pool in args] * repeat

Las piscinas no son resultados intermedios. Su slowrange()se consume por primera vez en una tupla (y otra tupla se crea a partir de los caracteres en la "AB"cadena), y de las tuplas de la piscina se producen los resultados (utilizando una serie de índices en esas tuplas).

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=292754&siteId=1
Recomendado
Clasificación