Python, функция пропускает условие - PullRequest
2 голосов
/ 07 мая 2020

Я скопировал l oop функцию, которая возвращает значение последовательности фиббоначчи по введенному индексу.

Теперь я пытаюсь написать функцию «tester ()», которая находит первый индекс этой последовательности, расчет которой взял запрограммируйте определенное количество миллисекунд, и когда я ввожу, например, 3 мс, программа вычисляет все, но на выходе показано, что программа длилась 0 мс.

def fib_loop(n):
start = int(datetime.now().strftime("%Y%m%d%H%M%S%f")[:-3]) #check system time when the function was initialize

n1, n2 = 1, 1
count = 0

if n == 1 or n == 2:
   return n1
else:
    while count < n-2:
        nth = n1 + n2
        # update values
        n1 = n2
        n2 = nth
        count += 1
    stop = int(datetime.now().strftime("%Y%m%d%H%M%S%f")[:-3]) #check system time on the end of the function
    time = stop - start  #compare times to get the milisecounds of function works
    return time 

def tester(miliseconds):
    x = 0
    while True:
        if fib_loop(x) <= miliseconds:
            x += 1
        else:
            return x, fib_loop(x)

print(tester(3))  #(2747, 0)

Как вы видите, когда я ввожу 3 мс в качестве параметра, функция возвращает около 3000-го индекса последовательности, но fib_l oop (x) == 0 (fib_l oop (x) возвращает, сколько времени эта функция продержалась), как это возможно, если fib_l oop (x) должен быть больше миллисекунд, чтобы перейти к возврату?

    if fib_loop(x) <= miliseconds:
        x += 1
    else:
        return x, fib_loop(x)

PS: Когда я передаю больший параметр функции tester (), например 10, он возвращает + - 7. Можете ли вы объяснить мне, почему это происходит? Заранее большое спасибо и очень извините за мой engli sh.

1 Ответ

1 голос
/ 07 мая 2020

Это то, что вы ищете, я добавил обертку функции для времени выполнения, для получения дополнительной информации google 'python decorator':

import time

# wrapper function for decorating fib_loop
def time_func(func):
    def wrapper(*args, **kwargs):
        start = time.time() * 1000 # unix timestamp
        func(*args, **kwargs) # <------- fib_loop here
        stop = time.time() * 1000
        return stop - start
    return wrapper


@time_func # execute fib_loop wrapped in the operations above
def fib_loop(n):
    n1, n2 = 1, 1
    count = 0
    if n == 1 or n == 2:
        return n1
    else:
        while count < n-2:
            nth = n1 + n2
            # update values
            n1 = n2
            n2 = nth
            count += 1
            # removed timing from here

def tester(miliseconds):
    x = 0
    while True:
        duration = fib_loop(x)
        data = {x: duration} # format the data as a dictionary, just because
        if duration <= miliseconds:
            print(data)
            x += 1
        else:
            print('')
            return data # return the index and duration of the first sequence above the threshold

print(tester(3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...