#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