@HitGirl

Как работает преобразование времени в Python?

Есть следующий код для измерения времени:
import time

data = (("apple", "car"), ("street", "beer"), ("plate"))
search = ("apple","plate")

# benchmark start
start = ((time.time_ns() / 1000000) / 1000)%60

# solution
def test_solution():
  out = []
  for s in search:
    for dk, dv in enumerate(data):
      if s in dv:
        out.append((s, dk))

  return out

for x in range(0, 1000000):
  test_solution()
  
# benchmark end
end = ((time.time_ns() / 1000000) / 1000)%60

# print result & benchmark result
print(test_solution())
print("time taken:", f"{end-start:.5f}ms")


Так мы получаем время миллисекундах:
(time.time_ns() / 1000000)
Объясните пожалуйста, почему нужно ещё разделить на 1000 и взять остаток от деления на 60?
  • Вопрос задан
  • 230 просмотров
Решения вопроса 2
twobomb
@twobomb
Неизвестно.
По сути здесь время переводят из наносекунд в милисекунду а потом из милисекунд в секунды.
А остаток просто ограничит это 60 секундами. По идее такой таймер может показать неверное время и чем больше времени выполняется тем больше вероятность неверных значений
P.S. Например если
start = 50
end = 10
То результат будет -40, а должен быть 20 или 80 или 140 или сколько минут там у нас выполняется что-то....
Ответ написан
Комментировать
Maksim_64
@Maksim_64
Data Analyst
1. Отступы в вашем коде (2) пробела должно быть 4.
2. По существу вопроса 1 ns (нано секунда) = 10^(-9). То есть 1 sec / 1_000_000_000 то есть вы перевели в секунды. А ваш код (якобы выдает в (милисекундах)). По факту ваш результат в секундах. %60 - ничего не меняет в вашем коде вы можете убрать (и там где start и там где end естественно) и ничего не изменится. число на выходе вы получите тоже самое.
3. Правильно использовать
start = time.perf_counter()
ваш код
end = time.perf_counter()

end - start даст вам продолжительность выполнения кода в секундах.
Обратите еще раз внимание что ваш код подсчитал в в секундах а вы говорите что милисекундах. print("time taken:", f"{end-start:.5f}ms")
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Я-бы переписал так.

# benchmark start
start = time.time_ns()
.....
end = time.time_ns()

Это избавляет меня от обнуления на 60-й секунде.

А все остальные преобразования единиц измерений времени в физике я-бы сделал уже при печати на экран.
Так - правильнее. Никто не придерется что мы теряем точность.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы