2016-12-06 4 views
0

У меня возникла проблема с измерением времени функции.Время работы функции python

Моя функция является «линейный поиск»:

def linear_search(obj, item,): 
    for i in range(0, len(obj)): 
     if obj[i] == item: 
     return i 
    return -1 

И я сделал еще одну функцию, которая измеряет время в 100 раз, и добавляет все результаты в списке:

def measureTime(a): 
    nl=[] 
    import random 
    import time 
    for x in range(0,100): #calculating time 
     start = time.time() 
     a 
     end =time.time() 
     times=end-start 
     nl.append(times) 
    return nl 

Когда я m, используя measureTime(linear_search(list,random.choice(range(0,50)))), функция всегда возвращает [0.0].

Что может вызвать эту проблему? Благодарю.

+0

, потому что ваш метод a не вызывается в цикле, но только один раз, прежде чем вы вызовете метод – martijnn2008

+0

Я не могу вызвать функцию внутри функции? как я могу это решить? thanks – Guy

+0

Вы можете передать функцию как аргумент другой функции, но для этого требуется другой синтаксис. См. Мой ответ. – martijnn2008

ответ

0

Взгляните на следующий пример, не знаю точно, что вы пытаетесь достичь, так что я догадался;)

import random 
import time 

def measureTime(method, n, *args): 
    start = time.time() 
    for _ in xrange(n): 
     method(*args) 
    end = time.time() 
    return (end - start)/n 

def linear_search(lst, item): 
    for i, o in enumerate(lst): 
     if o == item: 
      return i 
    return -1 

lst = [random.randint(0, 10**6) for _ in xrange(10**6)] 
repetitions = 100 
for _ in xrange(10): 
    item = random.randint(0, 10**6) 
    print 'average runtime =', 
    print measureTime(linear_search, repetitions, lst, item) * 1000, 'ms' 
1

вы фактически проходящее результат linear_search в функции measureTime, что вам нужно передать в функции и аргументах, а не для них, чтобы быть выполнить внутри measureTime функций как @ martijnn2008 ответить

Или лучше мудрым вы можете рассмотреть возможность использования timeit модуля для работы для вас

from functools import partial 
import timeit 
def measureTime(n, f, *args): 
    # return average runtime for n number of times 
    # use a for loop with number=1 to get all individual n runtime 
    return timeit.timeit(partial(f, *args), number=n) 

# running within the module 
measureTime(100, linear_search, list, random.choice(range(0,50))) 

# if running interactively outside the module, use below, lets say your module name mymodule 
mymodule.measureTime(100, mymodule.linear_search, mymodule.list, mymodule.random.choice(range(0,50))) 
Смежные вопросы