Python

Очень нужна помощь с программой на Python! 1 курс матфака

работаю с библиотекой time.
У меня есть блок def, который выполняет сортировку, к примеру - сортировка пузырчатого вида
def bubble_sort(array):
for i in range(0,len(array)-1):
for j in range(len(array)-1):
if(array[j] > array[j+1]):
temp = array[j]
array[j] = array[j+1]
array[j+1] = temp
return array
Перелистал все ролики и зарубежные форумы, но не нашел ответа: Как я могу посчитать время выполнения данной функции в секундах, формат ответа должен быть просто float числом (секунды, миллисекунды).
Пробовал такой код:
arr = []
start1 = time.ctime()
bubble_sort(arr)
end1 = time.ctime()
total1 = end1 - start1
print(start1, end1)
print(total1)

Формат выдачи start1 и end1 таков: Tue Mar 21 02:00:49 2023 Tue Mar 21 02:00:49 2023
Соответственно, при вычитании end1 и start1 выдает ошибку, поскольку пытаюсь вычитать строки. Как изменить такой формат записи в секунды, и, поскольку время выполнения меньше секунды, как учесть миллисекунды, чтобы при вычитании величин start1 и end1 не был 0?

Если есть знатоки библиотеки time, буду очень благодарен за вашу помощь!
[Сгенерировано нейросетью]

 import time 

def bubble_sort(array):
for i in range(0,len(array)-1):
for j in range(len(array)-1):
if(array[j] > array[j+1]):
temp = array[j]
array[j] = array[j+1]
array[j+1] = temp
return array

arr = []
start_time = time.time()
bubble_sort(arr)
end_time = time.time()
total_time = "%.3f" % (end_time - start_time)
print("Время выполнения: {} секунд".format(total_time))

P.S. Выведет 0, но если использовать массив с более длинной задержкой (а не пустой arr=[]), то будет уже не просто 0.
Например:
 import time 

def bubble_sort(array):
for i in range(0,len(array)-1):
for j in range(len(array)-1):
if(array[j] > array[j+1]):
temp = array[j]
array[j] = array[j+1]
array[j+1] = temp
return array

arr = [5, 4, 3, 2, 1] * 100
start_time = time.time()
bubble_sort(arr)
end_time = time.time()
total_time = "%.3f" % (end_time - start_time)
print("Время выполнения: ", total_time, "секунд")
AA
Aviator1 As
3 116
Лучший ответ
не, ну для матфака надо уж по-взрослому:
провести по нескольку тестов для одного размера и осреднить результат
повторить процедуру для разных размеров и посмотреть зависимость скорости от размера.

дла пузырька самым плохим будет "перевернутый" массив: [3, 2, 1] -> [1, 2, 3]
на таких массивах и протестируем:
 import time 

# сортировка пузырьком
def bubble_sort(array) :

for i in range(len(array)-1, 0, -1) :

can_exit = True

for j in range(i) :
if array[j] > array[j+1]:
array[j], array[j+1], can_exit = array[j+1], array[j], False

if can_exit : break

return array


# количество тестов
NUM_OF_TESTS = 1000


# насчитываем времена сортировки в зависимости от размера массива
for num_of_elements in range(1, 100) :

arrs = [[-i for i in range(num_of_elements)] for _ in range(NUM_OF_TESTS)]

lo = time.time()*1000
for a in arrs : bubble_sort(a)
hi = time.time()*1000

print(f"array size {num_of_elements:3} average time: {(hi-lo)/NUM_OF_TESTS} ms")

дальше можно загнать полученные результаты в ексель и построить вот такую симпатичную диаграмму:результат очень похож на параболу, так что, наверно, с оценкой O(n^2) учебники не врут.
Bahrom Yusupov
Bahrom Yusupov
77 914
тут дело не в знании библиотек, а в знании элементарных типов данных (основы программирования) и службы времени в компьютере (не поглумиться, а выразить законное недоумение уровнем вопроса при якобы общим владении темой (по существу несколько раз ответили выше))
Игорь Ермолаев
Игорь Ермолаев
65 508
Ответ ИИ (Chat GPT): "Чтобы решить вашу проблему, вам нужно использовать модуль time более правильно. В частности, метод time() этого модуля возвращает количество секунд, прошедших с начала эпохи (1 января 1970 года). Используя этот метод, вы можете измерить время выполнения функции следующим образом:

python
Copy code
import time

def bubble_sort(array):
# тело функции

arr = [5, 4, 3, 2, 1]
start_time = time.time()
bubble_sort(arr)
end_time = time.time()
elapsed_time = end_time - start_time
print(f"Время выполнения: {elapsed_time:.6f} сек.")
В данном примере start_time и end_time представляют собой время в секундах с начала эпохи, которое соответствует моменту перед вызовом функции и после ее выполнения соответственно. Вычитание end_time и start_time дает количество секунд, затраченных на выполнение функции. Функция print() выводит время выполнения в секундах с точностью до 6 знаков после запятой.

Если вы хотите узнать время выполнения функции в миллисекундах, можно умножить результат на 1000:

python
Copy code
elapsed_time = (end_time - start_time) * 1000
print(f"Время выполнения: {elapsed_time:.6f} мс.")
Надеюсь, это поможет вам решить вашу проблему!"
Иван Высоцкий
Иван Высоцкий
6 054
Чтобы посчитать время выполнения функции в секундах, можно использовать модуль `time` следующим образом:
import time

def bubble_sort(array):
for i in range(len(array)-1):
for j in range(len(array)-1):
if array[j] > array[j+1]:
temp = array[j]
array[j] = array[j+1]
array[j+1] = temp
return array

arr = [3, 2, 1]

start_time = time.time()
sorted_arr = bubble_sort(arr)
end_time = time.time()

elapsed_time = end_time - start_time

print(f"Sorted array: {sorted_arr}")
print(f"Elapsed time: {elapsed_time:.6f} seconds")

Здесь мы используем функцию `time.time()` для получения текущего времени в секундах с начала эпохи Unix (1 января 1970 года). После выполнения функции сортировки мы снова вызываем `time.time()` и вычитаем из текущего времени начальное время, чтобы получить общее время выполнения функции. Чтобы вывести время с точностью до миллисекунд, мы используем форматированную строку с опцией форматирования `:.6f`, которая указывает, что нужно вывести число с точностью до 6 знаков после запятой.

Надеюсь, это поможет вам решить вашу задачу!
Ленера Хуснутдинова Вы знаете, ваша программа хотя бы заставила вывести эти злосчастные нули! Но по какой-то причине миллисекунды не посчитались, если вам не трудно, сможете посмотреть выделенный фрагмент кода?