Импорт функции внутри функции для использования с timeit - PullRequest
2 голосов
/ 21 февраля 2020

Я синхронизирую скорость нескольких функций и обнаружил, что модуль timeit наиболее полезен, поскольку возвращает среднее значение. Я могу использовать то, что у меня хорошо, вне функции, но когда я пытаюсь очистить свой код и вставить его в функцию И очистить выходные данные своего ноутбука, я получаю ImportError.

Так что это область видимости вопрос, я вполне уверен. Я, конечно, удостоверился, что мои записные книжки с моими факториальными функциями были запущены, поэтому я не знаю, как мои функции не могут быть видны calling_functions(x,y,z)

Надеюсь, это не слишком много, чтобы попросить некоторые помогите, заранее спасибо.

За пределами функции работает нормально:

# Declaring variables
functions = [factorial_iterative, factorial_non_tail, factorial_tail, factorial_memoization] # Which functions to run, no arguments
num_of_factorial = 100 # Factorial of which number to calculate, suggest 10-100
num_of_runs = 10000 # How many runs per factorial, suggest 10-10000

# Declaring lists to be filled with runtime
factorial_iterative_time = []
factorial_non_tail_time = []
factorial_tail_time = []
factorial_memoization_time = []


for function in functions: # Iterating over functions list
    for i in range(1,num_of_factorial,1): # Iterating through number of factorials to calculate
        if __name__ == '__main__': # Importing functions into local scope. ref:https://docs.python.org/2/library/timeit.html
            if function == factorial_iterative: # Appending to correct list
                # Append output from timeit to correct list. i is factorial number, import function and i from main, run current iteration for defined many times
                factorial_iterative_time.append(timeit.timeit("function(i)", setup="from __main__ import function, i", number=num_of_runs))
            if function == factorial_non_tail:
                factorial_non_tail_time.append(timeit.timeit("function(i)", setup="from __main__ import function, i", number=num_of_runs))
            if function == factorial_tail:
                factorial_tail_time.append(timeit.timeit("function(i)", setup="from __main__ import function, i", number=num_of_runs))
            if function == factorial_memoization:
                factorial_memoization_time.append(timeit.timeit("function(i)", setup="from __main__ import function, i", number=num_of_runs))

Внутри функции, сломанной в чистой записной книжке:

def calling_functions(function, num_of_factorial=100, num_of_runs=10000):
    times = []
    for i in range(1,num_of_factorial,1): # Iterating through number of factorials to calculate
        if __name__ == '__main__':
            times.append(timeit.timeit("function(i)", setup="from __main__ import function, i", number=num_of_runs))
    return (times) 

factorial_non_tail_time = calling_functions(factorial_non_tail)

ImportError: cannot import name 'function' from '__main__' (unknown location)
...