2017-03-09 2 views
0

Je suis actuellement dans les travaux d'essayer de chronométrer une fonction de tri de fusion. Le seul problème est que la fonction de tri de fusion est récursive et retournera l'heure chaque fois qu'elle a été terminée.Comment chronométrer une fonction récursive?

Comment puis-je résoudre ce problème?

def MergeSort(argShuffledList): 
    dblStart = time.clock() 
    if len(argShuffledList)>1: 
     intMidValue = len(argShuffledList)//2 
     listLeftHalf = argShuffledList[:intMidValue] 
     listRightHalf = argShuffledList[intMidValue:] 

     left_part = MergeSort(listLeftHalf) 
     right_part = MergeSort(listRightHalf) 


     i=0 
     j=0 
     k=0 
     while i < len(listLeftHalf) and j < len(listRightHalf): 

      if listLeftHalf[i] < listRightHalf[j]: 
       argShuffledList[k]=listLeftHalf[i] 
       i =i+1 

      else: 
       argShuffledList[k]=listRightHalf[j] 
       j=j+1 

      k=k+1 

     while i < len(listLeftHalf): 
      argShuffledList[k]=listLeftHalf[i] 
      i=i+1 
      k=k+1 


     while j < len(listRightHalf): 
      argShuffledList[k]=listRightHalf[j] 
      j=j+1 
      k=k+1 


    intTime = "%.2f" % ((time.clock() - dblStart) * 1000000) 
    message = "Elasped Time: " + str(intTime) + " microseconds" 
    print("Selection Sort: ", argShuffledList) 
    print(message, "\n") 
+7

Pourquoi avoir un code temporel dans la fonction? Pourquoi ne pas simplement enregistrer le temps avant d'appeler et après le retour? – Carcigenicate

+1

@Carcigenicate Oui, exactement. De plus, il faut utiliser le module 'timeit'. –

Répondre

2

Avez-vous essayé de déplacer la temporisation en dehors de la méthode? En d'autres termes, commencez la synchronisation, puis appelez votre méthode, puis arrêtez la synchronisation:

# Start timing 
dblStart = time.clock() 
# Call method 
MergeSort(argShuffledList) 
# Stop timing and print results 
intTime = "%.2f" % ((time.clock() - dblStart) * 1000000) 
message = "Elasped Time: " + str(intTime) + " microseconds" 
print(message, "\n") 
+0

Bon exemple de l'approche naïve. L'utilisation d'une bibliothèque de chronométrage comme suggéré par juanpa serait une bonne chose à mentionner et montrer l'utilisation de. Un seul test de synchronisation est totalement inutile pour n'importe quel but. – Carcigenicate