J'écrivais une fonction python qui ressemblait à quelque chose comme ça
def foo(some_list):
for i in range(0, len(some_list)):
bar(some_list[i], i)
de sorte qu'il a été appelé avec
x = [0, 1, 2, 3, ... ]
foo(x)
J'avais supposé que l'accès à l'index des listes était O(1)
, mais j'ai été surpris de constater que pour les grandes listes, c'était beaucoup plus lent que prévu.
Ma question est alors de savoir comment les listes python sont implémentées et quelle est la complexité d'exécution des éléments suivants)
list[x]
list.pop()
list.pop(0)
list.append(x)
Pour des crédits supplémentaires, des épissures ou des pops arbitraires.
il y a n tableau très détaillé sur python wiki qui répond à votre question.
Cependant, dans votre exemple particulier, vous devez utiliser enumerate
pour obtenir un index d'un itérable dans une boucle. ainsi:
for i, item in enumerate(some_seq):
bar(item, i)
La réponse est "indéfinie". Le langage Python ne définit pas l'implémentation sous-jacente. Voici quelques liens vers un fil de discussion qui pourrait vous intéresser.
De plus, la façon la plus pythonique d'écrire votre boucle serait la suivante:
def foo(some_list):
for item in some_list:
bar(item)
Les listes sont en effet O(1) à indexer - elles sont implémentées comme un vecteur avec une surutilisation proportionnelle, donc effectuez autant que vous attendez. La raison probable pour laquelle vous trouviez ce code plus lent que prévu est l'appel à "range(0, len(some_list))
".
range()
crée une nouvelle liste de la taille spécifiée, donc si some_list a 1 000 000 d'articles, vous allez créer une nouvelle liste d'un million d'articles à l'avance. Ce comportement change en python3 (la plage est un itérateur), dont l'équivalent python2 est xrange , ou mieux encore dans votre cas, énumération
si vous avez besoin d'index et de valeur, utilisez enumerate:
for idx, item in enumerate(range(10, 100, 10)):
print idx, item
La liste Python n'est rien d'autre que des tableaux. Donc,
l'indexation prend O (1)
pour pop et ajouter à nouveau, il devrait être O(1) selon les documents
Consultez le lien suivant pour plus de détails:
http://dustycodes.wordpress.com/2012/03/31/pythons-data-structures-complexity-analysis/