2016-12-06 22 views
0

我在測量函數的時間時遇到問題。python-measure函數時間

我的功能是「線性搜索」:

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

我無法調用函數內的函數?我怎麼解決這個問題?謝謝 – 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)))