Last modified: Nov 05, 2024 By Alexander Williams

Python process_time(): Measuring CPU Time for Code Performance

When it comes to measuring code performance in Python, time.process_time() stands out as a reliable tool for tracking CPU time consumption. Unlike time.time(), it focuses purely on CPU time.

Understanding process_time()

process_time() measures the combined CPU time of the current process, including both user and system CPU time. It's particularly useful for benchmarking code performance without being affected by system sleep.

Unlike time.perf_counter(), which includes wall-clock time, process_time only counts actual CPU cycles used by your program.

Basic Usage Example


import time

start = time.process_time()
# Some computation
sum(range(1000000))
end = time.process_time()

print(f"CPU time: {end - start} seconds")


CPU time: 0.015625 seconds

Comparing with Other Timing Functions

While time.monotonic() is great for wall-clock timing, process_time() is better for measuring actual CPU usage in your code.


import time

def compare_timing_methods():
    start_process = time.process_time()
    start_perf = time.perf_counter()
    
    # Sleep doesn't count in process_time
    time.sleep(1)
    
    end_process = time.process_time()
    end_perf = time.perf_counter()
    
    print(f"Process time: {end_process - start_process}")
    print(f"Perf counter: {end_perf - start_perf}")

compare_timing_methods()


Process time: 0.000156
Perf counter: 1.001234

Best Practices for Performance Measurement

Multiple runs are crucial for accurate measurements. System load and other factors can affect individual measurements, so averaging multiple runs provides more reliable results.


import time
import statistics

def measure_performance(func, runs=5):
    times = []
    for _ in range(runs):
        start = time.process_time()
        func()
        end = time.process_time()
        times.append(end - start)
    
    return statistics.mean(times)

# Example usage
def test_function():
    return sum(i * i for i in range(10000))

average_time = measure_performance(test_function)
print(f"Average CPU time: {average_time:.6f} seconds")

Common Pitfalls to Avoid

Don't use process_time() for measuring operations that involve I/O or time.sleep(). These operations don't consume CPU time and won't be reflected in the measurements.

For timing code that includes I/O operations, consider using perf_counter() instead.

Advanced Usage with Context Manager


from contextlib import contextmanager

@contextmanager
def measure_time():
    start = time.process_time()
    yield
    end = time.process_time()
    print(f"Operation took {end - start:.6f} CPU seconds")

# Usage
with measure_time():
    sum(i * i for i in range(1000000))

Conclusion

time.process_time() is an essential tool for measuring CPU performance in Python applications. It provides accurate CPU time measurements for code optimization and benchmarking.

Remember to use it specifically for CPU-bound operations and combine it with other timing functions like perf_counter() when measuring overall execution time.