You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
time.process_time() constant / erratic on Windows #82040
Python 3.7.4, 64-bit, Windows version (installer version)
python-3.8.0b3-embed-amd64.zip
python-3.7.2.post1-embed-amd64.zip
on Windows 7 x64 Professional
time.process_time() always returns the same value. If I check the value of time.process_time_ns(), sometimes it is constant, sometimes I observe a few changes, then it becomes constant too.
Here is a log of an example session, I'm waiting at least 1-2 seconds between each command:
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> import time
>>> time.process_time()
0.1092007
>>> time.process_time()
0.1092007
>>> time.process_time_ns()
109200700
>>> time.process_time_ns()
124800800
>>> time.process_time_ns()
124800800
>>> time.process_time()
0.1248008
>>> time.process_time()
0.1248008
>>> time.process_time()
0.1248008
>>> time.process_time_ns()
124800800
>>> time.process_time_ns()
124800800
>>> time.process_time_ns()
124800800
>>> time.process_time_ns()
124800800
>>> time.clock()
Warning (from warnings module):
File "__main__", line 1
DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
77.006126126
>>> time.clock()
79.245575778
>>> time.clock()
80.801103036
>>> time.process_time()
0.1248008
>>>
I see that now. The behaviour was different in Linux, though, I suppose it may benefit from a more precise counter, but since in Windows it also has a precise counter with time.perf_counter_ns(), I was expecting to see that value change, but it was mainly a confusion with the older time.clock().
I suppose it may benefit from a more precise counter, but since in
Windows it also has a precise counter with time.perf_counter_ns(),
I was expecting to see that value change, but it was mainly a
confusion with the older time.clock().
Process times [1] are stored as a 64-bit integer in units of 100 ns (1e-7). But the kernel schedules threads based on a timer that ticks every 15.625 ms by default. It can be lowered to about 0.5 ms, but this degrades battery life.
Process times [1] are stored as a 64-bit integer in units of 100 ns (1e-7). But the kernel schedules threads based on a timer that ticks every 15.625 ms by default. It can be lowered to about 0.5 ms, but this degrades battery life.
Patches are welcome to enhance time.get_clock_info() :-)
Don't rely too much on time.get_clock_info() on Linux neither: it basically always say 1 ns, even if the effective resolution is way worse.
I see that now. The behaviour was different in Linux, though, I suppose it may benefit from a more precise counter, but since in Windows it also has a precise counter with time.perf_counter_ns(), I was expecting to see that value change, but it was mainly a confusion with the older time.clock().
On Windows, time.clock() was implemented with QueryPerformanceCounter(). This function became time.perf_counter() in Python 3.4. time.clock() was removed. Use time.get_clock_info('perf_counter') ;-)
The PEP-418 introduces new well defined clocks, since time.clock() was not portable.
perf_counter and process_time have very different properties. process_time is stopped when the process sleeps, for example.
Activity
RedGlyph commentedon Aug 14, 2019
Tested with
on Windows 7 x64 Professional
time.process_time() always returns the same value. If I check the value of time.process_time_ns(), sometimes it is constant, sometimes I observe a few changes, then it becomes constant too.
Here is a log of an example session, I'm waiting at least 1-2 seconds between each command:
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license()" for more information. >>> import time >>> time.process_time() 0.1092007 >>> time.process_time() 0.1092007 >>> time.process_time_ns() 109200700 >>> time.process_time_ns() 124800800 >>> time.process_time_ns() 124800800 >>> time.process_time() 0.1248008 >>> time.process_time() 0.1248008 >>> time.process_time() 0.1248008 >>> time.process_time_ns() 124800800 >>> time.process_time_ns() 124800800 >>> time.process_time_ns() 124800800 >>> time.process_time_ns() 124800800 >>> time.clock() Warning (from warnings module): File "__main__", line 1 DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead 77.006126126 >>> time.clock() 79.245575778 >>> time.clock() 80.801103036 >>> time.process_time() 0.1248008 >>>zware commentedon Aug 14, 2019
Try this:
Or:
Basically, process_time() (and process_time_ns()) measure CPU time used by the process, and you aren't making the CPU do anything between your checks.
RedGlyph commentedon Aug 14, 2019
I see that now. The behaviour was different in Linux, though, I suppose it may benefit from a more precise counter, but since in Windows it also has a precise counter with time.perf_counter_ns(), I was expecting to see that value change, but it was mainly a confusion with the older time.clock().
Thanks!
eryksun commentedon Aug 14, 2019
Don't read too much into the clock info here:
>>> time.get_clock_info('process_time').resolution 1e-07Process times [1] are stored as a 64-bit integer in units of 100 ns (1e-7). But the kernel schedules threads based on a timer that ticks every 15.625 ms by default. It can be lowered to about 0.5 ms, but this degrades battery life.
[1] https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesstimes
vstinner commentedon Aug 14, 2019
Patches are welcome to enhance time.get_clock_info() :-)
Don't rely too much on time.get_clock_info() on Linux neither: it basically always say 1 ns, even if the effective resolution is way worse.
See the PEP-418 for some numbers:
https://www.python.org/dev/peps/pep-0418/#process-time
I wrote these programs to write this PEP ;-)
https://github.com/python/peps/tree/master/pep-0418
vstinner commentedon Aug 14, 2019
On Windows, time.clock() was implemented with QueryPerformanceCounter(). This function became time.perf_counter() in Python 3.4. time.clock() was removed. Use time.get_clock_info('perf_counter') ;-)
The PEP-418 introduces new well defined clocks, since time.clock() was not portable.
perf_counter and process_time have very different properties. process_time is stopped when the process sleeps, for example.
https://docs.python.org/dev/library/time.html#time.perf_counter
https://docs.python.org/dev/library/time.html#time.process_time