web-dev-qa-db-fra.com

Quelle est la complexité d'exécution des fonctions de liste python?

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)

  • Indexation: list[x]
  • Popping depuis la fin: list.pop()
  • Popping depuis le début: list.pop(0)
  • Extension de la liste: list.append(x)

Pour des crédits supplémentaires, des épissures ou des pops arbitraires.

43
Marquis Wang

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)
35
SilentGhost

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)
8
anthony

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

6
Brian

si vous avez besoin d'index et de valeur, utilisez enumerate:

for idx, item in enumerate(range(10, 100, 10)):
    print idx, item
3
Maxim Kim

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/

1
codersofthedark