Я рассчитывал свою функцию, чтобы выяснить, откуда исходит высокое время выполнения, и заметил, что совокупное время внутри цикла намного меньше, чем время самого цикла.
Я использую глобальную переменную Node.sstats для хранения совокупного времени, т.е. на каждой итерации увеличивается переменная, хранящая общее время.
Я упростил свой код, но не верю, что это меняет проблему. Я измеряю время цикла (t3-t2), а также общее время внутри цикла (t5-t4). Время для t3 - t2 в 10 раз больше, чем для t5 - t4. Следовательно, время цикла намного больше, чем совокупное время содержимого цикла. Я также проверил, и время обновления глобальной переменной Node.ksstats (t5b-t5) не имеет значения по сравнению с общим временем цикла (<1%). Так является ли сам механизм зацикливания причиной или он имеет какое-то отношение к доступу к памяти?
Вот мой код
t2 = time.time()
for a in range(0, d):
t4 = time.time()
t6 = time.time()
kurt[a], moments[a] = ik.incr_kurtosis(X[:,a], moments[a])
t7 = time.time()
Node.ksstats[2] += (t7- t6)
kurt[a] = log(kurt[a] + 1)
summ += kurt[a]
# measure the cumulative time of the loop contents
t5 = time.time()
Node.ksstats[3] += (t5-t4)
# measure cumulative time to update ksstats variable
t5b= time.time()
Node.ksstats[5] += (t5b-t5)
# time entire for loop
t3 = time.time()
Node.ksstats[4] += (t3 - t2)
ОБНОВИТЬ
Я все еще не уверен, что происходит, но я уравнял внутреннее и внешнее время цикла, обновив локальную переменную ksstats внутри цикла вместо переменной класса, Node.ksstats
Мне известны инструменты профилирования, но я до сих пор не понимаю лежащего в основе механизма, вызывающего это
Можете ли вы попробовать time.monotonic()
вместо time.time()
, чтобы посмотреть, изменится ли что-нибудь?
для меня это ничего не меняет.
Неужели d
около 10 случайно?
Нет d зависит от набора данных (количества измерений) и составляет 166 в наиболее проблемном примере.
Лучше использовать инструменты профилирования Pylton docs.python.org/3/library/profile.html вместо того, чтобы пытаться свернуть свои собственные.