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?
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) ...
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).
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
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)")