Des mutations de listes en Python réduisent dans une mémoire de manière efficace?

StackOverflow https://stackoverflow.com/questions/5349755

  •  27-10-2019
  •  | 
  •  

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?

Était-ce utile?

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))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top