Jak mogę uzyskać bieżący czas w milisekundach w Pythonie?
time.time()
może zapewniać gorszą precyzję niż datetime.utcnow()
na niektórych platformach i wersjach Pythona.
Jak mogę uzyskać bieżący czas w milisekundach w Pythonie?
time.time()
może zapewniać gorszą precyzję niż datetime.utcnow()
na niektórych platformach i wersjach Pythona.
Odpowiedzi:
Oto, co potrzebowałem, oto co zrobiłem na podstawie powyższego komentarza @samplebias:
import time
millis = int(round(time.time() * 1000))
print millis
Szybko i łatwo. Dzięki wszystkim, przepraszam za pierdnięcie mózgu.
Do ponownego użycia:
import time
current_milli_time = lambda: int(round(time.time() * 1000))
Następnie:
>>> current_milli_time()
1378761833768
round
? Wydaje się, że int(time.time() * 1000)
wystarczy?
.utcnow()
używa GetSystemTimeAsFileTime()
ostatnio CPython w systemie Windows . Czy time.clock()
wywołanie ( QueryPerformanceCounter()
) nie wprowadziłoby więcej szumów niż mogłoby to zredukować? Zobacz Precyzja to nie to samo co dokładność .
time.time()
może dać rozdzielczość tylko drugiemu, preferowanym podejściem dla milisekund jest datetime
.
from datetime import datetime
dt = datetime.now()
dt.microsecond
def TimestampMillisec64():
return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000)
.total_seconds()
(prawdopodobnie) lepszą precyzję: (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3
(z włączonym prawdziwym dzieleniem) Lub jeśli chcesz skrócić milisekundy, użyj // 10**3
.
Od wersji 3.7 możesz użyć, time.time_ns()
aby uzyskać upływ czasu w ciągu nano sekund od epoki. Więc możesz to zrobić
ms = time.time_ns() // 1000000
uzyskać czas w mili-sekundach jako liczbę całkowitą.
Jeśli potrzebujesz prostej metody w kodzie, która zwraca milisekundy z datetime:
from datetime import datetime
from datetime import timedelta
start_time = datetime.now()
# returns the elapsed milliseconds since the start of the program
def millis():
dt = datetime.now() - start_time
ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
return ms
start_time
= datetime (1970,1,1)
.utcnow()
zamiast tego lub jeśli nie potrzebujesz czasu bezwzględnego, możesz użyć time.monotonous()
. Uwaga: istnieje subtelna różnica wynikająca z arytmetyki zmiennoprzecinkowej między some_int + dt.microseconds/ 1000.0
formułą ( ) / 10**3
i włączonym prawdziwym dzieleniem. Zobacz wyraźną formułę i link total_seconds()
w pokrewnej odpowiedzi
Jeśli obawiasz się o pomiar upływającego czasu, powinieneś użyć zegara monotonicznego (python 3) . Aktualizacje zegara systemowego nie mają wpływu na ten zegar, tak jakbyś na przykład sprawdził, czy zapytanie NTP skorygowało czas systemowy.
>>> import time
>>> millis = round(time.monotonic() * 1000)
Podaje czas odniesienia w sekundach, który można wykorzystać do późniejszego porównania w celu pomiaru upływającego czasu.
Jeśli użyjesz mojego kodu (poniżej), czas pojawi się w sekundach, a następnie, po przecinku, w milisekundach. Myślę, że istnieje różnica między Windows i Unix - proszę o komentarz, jeśli tak jest.
from time import time
x = time()
print(x)
mój wynik (w systemie Windows) to:
1576095264.2682993
EDYCJA : Nie ma różnicy :) Dzięki tc0nn
/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
python3 scratch.py 1577212763.9136133
Te wielokrotności do 1000 w milisekundach mogą być przyzwoite do rozwiązania lub uczynienia pewnych warunków wstępnych akceptowalnymi. Można go użyć do wypełnienia luki w bazie danych, która tak naprawdę nigdy go nie używa. Chociaż w rzeczywistych sytuacjach, które wymagają precyzyjnego pomiaru czasu, ostatecznie się nie powiedzie. Nie sugerowałbym, aby ktokolwiek używał tej metody do operacji o znaczeniu krytycznym, które wymagają działań lub przetwarzania w określonym czasie.
Na przykład: pingi w obie strony mają 30-80 ms w USA ... Nie można tak po prostu zaokrąglić w górę i efektywnie wykorzystać.
Mój własny przykład wymaga zadań w każdej sekundzie, co oznacza, że gdybym zaokrąglił w górę po odpowiedzi na pierwsze zadania, nadal ponosiłbym czas przetwarzania pomnożony przez każdy cykl głównej pętli. Skończyło się to całkowitym wywołaniem funkcji co 60 sekund. to ~ 1440 dziennie ... niezbyt dokładne.
To tylko myśl dla osób szukających dokładniejszego rozumowania, które nie jest w stanie rozwiązać luki w bazie danych, która tak naprawdę nigdy jej nie wykorzystuje.
import time; ms = time.time()*1000.0