2017-02-08 8 views
-1

Итак, я использую функцию timeit/Timer в Python для разницы между аглоритом грубой силы и более эффективной версией nlogn. Моя проблема не работает в функции timeit.Python timeit импортирует переменные внутри функций

from timeit import Timer 
import timeit 
def BruteForce(A, u): 
     for z in A: 
      if u-z in A: 
       return u, z 
     return False 

def BinarySearchAlgo(A, u): 
    A.sort() 
    for z in A: 
     if BinarySearch(A, u-z) is True: 
      return u, z 
    return False 

def BinarySearch(list, item): 
    if len(list)==0: 
     return False 
    else: 
     midpoint = len(list)//2 
     if list[midpoint] == item: 
      return True 
     elif item < list[midpoint]: 
      return BinarySearch(list[:midpoint], item) 
     else: 
      return BinarySearch(list[midpoint+1:], item) 

def tests(): 
    TestFiles = ['listNumbers-10.txt', 'listNumbers2-10.txt','listNumbers- 100.txt','listNumbers2-100.txt','listNumbers-1000.txt','listNumbers2- 1000.txt','listNumbers-10000.txt','listNumbers2-10000.txt','listNumbers- 100000.txt','listNumbers2-100000.txt','listNumbers-1000000.txt','listNumbers2- 1000000.txt'] 
    for File in TestFiles: 
     results = [] 
     print("The following are timing tests for the file: ", File) 
     with open(File) as inputfile: 
      for line in inputfile: 
       results.append(int(line.strip())) 
     TestNumbers = [len(results)%2,len(results)%5,len(results)%13,len(results)%99, len(results)%209, len(results)%317, len(results)%464, len(results)%892, len(results)%777] 
     for n in TestNumbers: 
      BruteForceTime = Timer("BruteForce(results, n)", "from __main__ import BruteForce").timeit() 
      BinarySearchTime = Timer("BinarySearchAlgo(results, n)", "from __main__ import BinarySearchAlgo").timeit() 

      print("Test Number = ", n, "Brute Force Algo time = ", BruteForceTime, "Binary Search Algo time = ", BinarySearchTime) 

В следующих двух строках, когда я называю тесты функции(), я получаю ошибки о том, что результаты и п не определены. Мой вопрос в том, как я могу импортировать их в аргументы Timer, чтобы они были определены.

BruteForceTime = Timer("BruteForce(results, n)", "from __main__ import BruteForce").timeit() 
BinarySearchTime = Timer("BinarySearchAlgo(results, n)", "from __main__ import BinarySearchAlgo").timeit() 

Заранее спасибо за помощь

ответ

0

Используйте значение вместо переменной в выражении:

Timer("BruteForce({}, {})".format(results, n), 
     "from __main__ import BruteForce").timeit()