web-dev-qa-db-fra.com

Complexité de list.index (x) dans Python

Je fais référence à ceci: http://docs.python.org/tutorial/datastructures.html

Quel serait le temps d'exécution de la fonction list.index(x) en termes de notation O?

30
user734027

C'est O (n), consultez également: http://wiki.python.org/moin/TimeComplexity

Cette page documente la complexité temporelle (alias "Big O" ou "Big Oh") de diverses opérations dans CPython actuel. D'autres Python (ou des versions plus anciennes ou encore en cours de développement de CPython) peuvent avoir des caractéristiques de performances légèrement différentes. Cependant, il est généralement sûr de supposer qu'elles ne sont pas plus lentes de plus d'un facteur de O (log n) ...

33
zeekay

Selon ladite documentation:

list.index(x)

Renvoie l'index dans la liste du premier élément dont la valeur est x. C'est une erreur s'il n'y a pas un tel élément.

Ce qui implique une recherche. Vous faites effectivement x in s mais plutôt que de renvoyer True ou False vous retournez l'index de x. En tant que tel, j'irais avec le complexité temporelle indiquée de O (n).

8
user257111

Toute implémentation de liste aura une complexité O(n) pour une recherche linéaire (par exemple, list.index). Bien qu'il existe peut-être des implémentations loufoques qui font pire ...

Vous pouvez améliorer la complexité de la recherche en utilisant différentes structures de données, telles que des listes ou des ensembles ordonnés. Ceux-ci sont généralement implémentés avec des arbres binaires. Cependant, ces structures de données imposent des contraintes sur les éléments qu'elles contiennent. Dans le cas d'un arbre binaire, les éléments doivent être ordonnables, mais le coût de recherche descend jusqu'à O (log n).

Comme mentionné précédemment, recherchez ici les coûts d'exécution des structures de données standard Python: http://wiki.python.org/moin/TimeComplexity

1
Alex Smith

Utilisez le code suivant pour vérifier le timing. Sa complexité est O (n).

import time


class TimeChecker:

    def __init__(self, name):
        self.name = name

    def __enter__(self):
        self.start = self.get_time_in_sec()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        now = self.get_time_in_sec()
        time_taken = now - self.start  # in seconds
        print("Time Taken by " + self.name + ": " + str(time_taken))

    def get_time_in_sec(self):
        return int(round(time.time() * 1000))


def test_list_index_func(range_num):
    lis = [1,2,3,4,5]
    with TimeChecker('Process 1') as tim:
        for i in range(range_num):
            lis.index(4)

test_list_index_func(1000)
test_list_index_func(10000)
test_list_index_func(100000)
test_list_index_func(1000000)

print("Time: O(n)")
0
Geetesh Gupta