Как изменить синхронизируемую функцию?

#python

#python

Вопрос:

Я пытаюсь рассчитать время для всех различных алгоритмов сортировки, чтобы увидеть, какой из них самый быстрый, но каждый раз, когда я это делаю, мне нужно снова переписать нижнюю половину кода (под #####), за исключением того, что мне нужно изменить все имена переменных (и вместо selectionsort(mylist) Я делаю bubblesort (mylist) и т. Д.). Я думаю, это не конец света, но я не могу не представить, что это можно написать намного лучше. Я знаю, что есть другие варианты синхронизации, которые могут быть лучше, но мне сказали, что я должен использовать perf_count .

 def selectionsort(mylist):
    sortedlist=[]
    while len(mylist) > 0:
        lowest = mylist[0]
        for i in mylist:
            if i < lowest:
                lowest=i
        sortedlist.append(lowest)
        mylist.remove(lowest)
    return sortedlist

ivalues = [2,4,8,16,32,64,128,256,512,1024]
#####
sorttimelist = []
for i in range(1,11):
    mylist=[]
    for j in range(2**i):
        mylist.append(random.random())
    start_time=time.perf_counter()
    selectionsort(mylist)
    end_time=time.perf_counter()
    sorttime=end_time-start_time
    sorttimelist.append(sorttime)
 

Ответ №1:

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

 #####
for func in [selectionsort, bubblesort]:
    for i in range(1,11):
        mylist=[]
        for j in range(2**i):
            mylist.append(random.random())
        start_time = time.perf_counter()
        func(mylist)  # use func instead of selectionsort
        end_time = time.perf_counter()
        sorttime = end_time - start_time
        sorttimelist.append(sorttime)
 

Ответ №2:

Вы можете перебирать коллекцию функций, которые собираетесь тестировать. Смотрите пример:

 def selection_sort(my_list):
    pass

def bubble_sort(my_list):
    pass

functions = [selection_sort, bubble_sort]
for func in functions:
    func(list_to_sort)
 

Ответ №3:

Используйте декоратор, поместите @timit над своей функцией.

 import time

def timit(func):
    '''
    A Decorator that times how long it takes to return the function. Added time.sleep because some functions run under a seconds and would return 0 seconds.
    '''
    def inner(*args, **kwargs):
        start = float(time.time())
        time.sleep(1)
        test = func(*args, **kwargs)
        end = float(time.time())
        print(f'Funtion {func.__name__} took {end-start-1} seconds to complete')
        return test
    return inner

@timit
def bubble_sort(array):
    for last_idx in range(1,len(array)):
        is_sorted = True
        for idx in range(len(array)-last_idx-1):
            if array[idx] > array[idx 1]:
                is_sorted = False
                swap(array, idx, idx 1)
        if is_sorted is True:
            break
    return array

@timit
def selection_sort(array):
    for first_idx in range(len(array)-1):
        smallest = array[first_idx]
        for idx in range(first_idx 1, len(array)):
            if array[idx] < smallest:
                smallest = array[idx]
                swap(array, idx, first_idx)
    return array