Генерация матриц, соответствующих значению цикла
Моя цель - оценить время выполнения двух разных функций, которые выдают один и тот же результат. Я смотрю на np.linalg.det() и функцию, которую я сделал, называется mydet().
Для каждого цикла я бы хотел сгенерировать матрицу тревожных сигналов, где n находится в диапазоне (2,9). 2, потому что меньше будет не матрица, а 9, потому что больше и время выполнения будет значительным.
Я хочу, чтобы значение n соответствовало значению цикла i, поэтому n = i + 2? Я начинаю с 0, и мне нужно, чтобы начать с 2.
Я хочу измерить время, необходимое для каждого цикла, и добавить его в пустой список с именами my_det_time и np_det_time соответственно.
Прямо сейчас мой код только вычисляет сумму времени выполнения. Принимая во внимание, что я хотел бы взять время каждого цикла и добавить к спискам, которые я указал.
Что мне нужно изменить, чтобы оценить время каждого цикла и добавить время этого цикла в список, чтобы я мог видеть прогрессию времени по мере увеличения матрицы, а затем отображать данные для сравнения?
Спасибо
import time
start_time = time.time()
from random import randint
my_det_time = []
np_det_time = []
for i in range(8):
n = i+2
s = 10
A = [[round(random.random()*s) for i in range(n)] for j in range(n)]
np.linalg.det(A)
print("%s seconds" % (time.time() - start_time))
2 ответа
Вы могли бы иметь список раз:
exe_times = []
for i in range(8):
start = time.time()
n = i+2
s = 10
A = [[round(random.random()*s) for i in range(n)] for j in range(n)]
np.linalg.det(A)
end = time.time()
exe_times.append(end-start)
Но имейте в виду, что это время называется временем настенных часов, т. Е. Полное время, прошедшее с начала цикла и до конца цикла. На этот раз процессор не расходуется полностью, просто вычисляя инструкции внутри цикла. Это может быть проблемой, если, например, программа, связанная с процессором, запускается в то же время, что и ваш цикл с низкой длительностью, и останавливается до цикла с большой продолжительностью. В таком случае сравнение времени не будет точным.
Спасибо Х. Такон, это было чрезвычайно полезно.
Вот то, что я придумал, он делает все, что я хочу, я думаю.
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import time
from random import randint
my_det_time = []
np_det_time = []
for i in range(8):
start = time.time()
n = i+2
s = 10
A = [[round(random.random()*s) for i in range(n)] for j in range(n)]
mydet(A)
end = time.time()
my_det_time.append(end-start)
for i in range(8):
start = time.time()
n = i+2
s = 10
A = [[round(random.random()*s) for i in range(n)] for j in range(n)]
np.linalg.det(A)
end = time.time()
np_det_time.append(end-start)
plt.plot([2,3,4,5,6,7,8,9], np_det_time, 'r', label='np.linalg.det')
plt.plot([2,3,4,5,6,7,8,9], my_det_time, 'g', label='mydet')
red_patch = mpatches.Patch(color='red', label='np.linalg.det')
green_patch = mpatches.Patch(color='green', label='mydet')
plt.legend(handles=[red_patch, green_patch])
plt.title('mydet() vs. np.linalg.det()')
plt.ylabel('Execution Time (sec)')
plt.xlabel('Matrix Size (n x n)')
plt.show()