Des mutations de listes en Python réduisent dans une mémoire de manière efficace?
Question
Je suis un débutant à Python, ce qui est mon premier post, alors ne soyez pas trop dur :). Je joue autour avec Python ces derniers temps et me demandais si quelque chose comme
max([x for x in range(25)])
entraînerait python première création d'une liste de tous les éléments, puis de trouver le maximum, résultant en O (2n) fois, ou il garder une trace du maximum comme il a été pour itérer T (n). En outre, puisque diffère de gamme dans python3 (étant un itérable), qui serait le rendre différent que dans python2?
La solution
Votre exemple résultera en Python première construction de la liste entière. Si vous voulez éviter cela, vous pouvez utiliser une expression de générateur à la place:
max((x for x in range(25)))
ou simplement:
max(x for x in range(25))
Bien sûr (en Python 2), range
se construit une liste complète, donc ce que vous voulez vraiment dans ce cas est:
max(x for x in xrange(25))
Cependant, en ce qui concerne le temps, toutes ces expressions ont la même complexité. La différence importante est que le dernier a besoin d'espace O (1), tandis que les autres ont besoin d'espace O (n).
Autres conseils
Liste compréhensions génèrent toujours une liste (à moins que quelque chose lève une exception). Utilisation d'un dans la plupart des cas Genex est recommandé à la place.
max(x for x in xrange(25))