Python datetime.now () resolution
from datetime import datetime
import time
for i in range(1000):
curr_time = datetime.now()
print(curr_time)
time.sleep(0.0001)
I tested the resolution datetime.now()
. Since it assumes output in microseconds, I expected each print to be different.
However, I always get something like this.
...
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.212073
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
2015-07-10 22:38:47.213074
...
Why is this happening? Is there a way that I can get the exact timestamp down to the microsecond? I don't really need microseconds, but it would be nice to get 0.1ms resolution.
=== UPDATE ====
I compared it using time.perf_counter () and adding to the start datetime
from datetime import datetime, timedelta import time
datetime0 = datetime.now()
t0 = time.perf_counter()
for i in range(1000):
print('datetime.now(): ', datetime.now())
print('time.perf_counter(): ', datetime0 + timedelta(0, time.perf_counter()-t0))
print('\n')
time.sleep(0.000001)
I'm not sure how "accurate" it really is, but the resolution is at least higher ... it doesn't seem to matter since my computer can't even print at that high speed. For my purpose, for which I just need different timestamps to distinguish between different entries, this is good enough for me.
...
datetime.now(): 2015-07-10 23:24:18.010377
time.perf_counter(): 2015-07-10 23:24:18.010352
datetime.now(): 2015-07-10 23:24:18.010377
time.perf_counter(): 2015-07-10 23:24:18.010545
datetime.now(): 2015-07-10 23:24:18.010377
time.perf_counter(): 2015-07-10 23:24:18.010745
datetime.now(): 2015-07-10 23:24:18.011377
time.perf_counter(): 2015-07-10 23:24:18.010961
datetime.now(): 2015-07-10 23:24:18.011377
time.perf_counter(): 2015-07-10 23:24:18.011155
datetime.now(): 2015-07-10 23:24:18.011377
time.perf_counter(): 2015-07-10 23:24:18.011369
datetime.now(): 2015-07-10 23:24:18.011377
time.perf_counter(): 2015-07-10 23:24:18.011596
datetime.now(): 2015-07-10 23:24:18.012379
time.perf_counter(): 2015-07-10 23:24:18.011829
datetime.now(): 2015-07-10 23:24:18.012379
time.perf_counter(): 2015-07-10 23:24:18.012026
datetime.now(): 2015-07-10 23:24:18.012379
time.perf_counter(): 2015-07-10 23:24:18.012232
datetime.now(): 2015-07-10 23:24:18.012379
time.perf_counter(): 2015-07-10 23:24:18.012424
datetime.now(): 2015-07-10 23:24:18.012379
time.perf_counter(): 2015-07-10 23:24:18.012619
datetime.now(): 2015-07-10 23:24:18.013380
time.perf_counter(): 2015-07-10 23:24:18.012844
datetime.now(): 2015-07-10 23:24:18.013380
time.perf_counter(): 2015-07-10 23:24:18.013044
datetime.now(): 2015-07-10 23:24:18.013380
time.perf_counter(): 2015-07-10 23:24:18.013242
datetime.now(): 2015-07-10 23:24:18.013380
time.perf_counter(): 2015-07-10 23:24:18.013437
datetime.now(): 2015-07-10 23:24:18.013380
time.perf_counter(): 2015-07-10 23:24:18.013638
datetime.now(): 2015-07-10 23:24:18.014379
time.perf_counter(): 2015-07-10 23:24:18.013903
datetime.now(): 2015-07-10 23:24:18.014379
time.perf_counter(): 2015-07-10 23:24:18.014125
datetime.now(): 2015-07-10 23:24:18.014379
time.perf_counter(): 2015-07-10 23:24:18.014328
datetime.now(): 2015-07-10 23:24:18.014379
time.perf_counter(): 2015-07-10 23:24:18.014526
datetime.now(): 2015-07-10 23:24:18.014379
time.perf_counter(): 2015-07-10 23:24:18.014721
datetime.now(): 2015-07-10 23:24:18.015381
time.perf_counter(): 2015-07-10 23:24:18.014919
...
source to share
It could be a limitation time.sleep
on your system, not datetime.now()
... or it could be both. What OS and what version and distribution of Python are you using?
Your system may not offer the "subsecond precision" mentioned in the docs time.sleep
:
sleep(...)
sleep(seconds)
Delay execution for a given number of seconds. The argument may be
a floating point number for subsecond precision.
On Linux 3.x on amd64 with CPython 2.7 , I get something pretty close to the 0.0001 time steps you intended:
2015-07-10 19:58:24.353711
2015-07-10 19:58:24.353879
2015-07-10 19:58:24.354052
2015-07-10 19:58:24.354227
2015-07-10 19:58:24.354401
2015-07-10 19:58:24.354577
2015-07-10 19:58:24.354757
2015-07-10 19:58:24.354938
source to share