Python time.process_time 函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨了 Python 的 time.process_time
函数,该函数返回当前进程使用的 CPU 时间。我们将涵盖 CPU 时间测量、性能基准测试和实际计时示例。
基本定义
time.process_time
函数将当前 CPU 时间作为以秒表示的浮点数返回。 它测量系统和用户 CPU 时间。
主要特点:仅测量进程 CPU 时间(不测量睡眠时间)、平台相关的精度,并且可用于 CPU 密集型性能测量。 返回值是一个浮点数,用于表示亚秒级精度。
基本 CPU 时间测量
time.process_time
最简单的用法是测量已使用的 CPU 时间。 此示例显示了基本用法以及与挂钟时间的比较。
import time # Get current CPU time cpu_start = time.process_time() # Perform CPU-bound work sum(range(10000000)) cpu_end = time.process_time() print(f"CPU time used: {cpu_end - cpu_start:.4f} seconds") # Compare with wall-clock time wall_start = time.time() sum(range(10000000)) wall_end = time.time() print(f"Wall-clock time: {wall_end - wall_start:.4f} seconds")
此示例演示了测量 CPU 时间与挂钟时间。 只有当进程主动使用 CPU 时,才会计入 CPU 时间。
该差异显示了花费在等待而不是计算上的时间。 这对于性能优化很有用。
测量函数 CPU 时间
time.process_time
非常适合测量 CPU 密集型函数的性能。 此示例演示如何对 CPU 密集型函数进行计时。
import time def cpu_intensive_task(): result = 0 for i in range(10000000): result += i * i return result # Start CPU timer start_cpu = time.process_time() # Execute CPU-bound function result = cpu_intensive_task() # Calculate CPU duration end_cpu = time.process_time() cpu_duration = end_cpu - start_cpu print(f"Function result: {result}") print(f"CPU time used: {cpu_duration:.6f} seconds")
此模式测量实际 CPU 使用率,忽略任何等待时间。 它非常适合优化 CPU 密集型算法。
process_time
的精度使其适用于微基准测试紧密循环和数学运算。
比较 CPU 时间与挂钟时间
此示例演示了当涉及睡眠操作时,CPU 时间和挂钟时间之间的差异。
import time def mixed_operation(): # CPU-bound work sum(range(1000000)) # I/O-bound wait time.sleep(1) # More CPU work sum(range(1000000)) # CPU time measurement cpu_start = time.process_time() mixed_operation() cpu_end = time.process_time() print(f"CPU time: {cpu_end - cpu_start:.4f} sec") # Wall time measurement wall_start = time.time() mixed_operation() wall_end = time.time() print(f"Wall time: {wall_end - wall_start:.4f} sec")
process_time
忽略睡眠时间,而 time.time
测量总经过时间。 这表明 I/O 如何影响性能。
对于 CPU 密集型优化,请关注 CPU 时间。 对于整体性能,请同时考虑这两个指标。
分析多个操作
此示例使用 process_time
来分析不同的操作并比较它们的 CPU 使用率。
import time import math def measure_operation(op, name): start = time.process_time() op() duration = time.process_time() - start print(f"{name}: {duration:.6f} sec") # Define operations def list_comp(): [x*x for x in range(1000000)] def map_lambda(): list(map(lambda x: x*x, range(1000000))) def math_operations(): for x in range(10000): math.sin(x) + math.cos(x) # Profile each operation measure_operation(list_comp, "List comprehension") measure_operation(map_lambda, "Map with lambda") measure_operation(math_operations, "Math functions")
此技术有助于识别代码中 CPU 密集型操作。 结果可以指导优化工作。
请注意,绝对时间可能因运行而异,但相对比较对于优化仍然有意义。
跟踪累积 CPU 时间
此示例演示了跨多个函数调用或迭代跟踪累积 CPU 时间。
import time import random def process_data(data): # Simulate variable CPU load time.sleep(random.random() * 0.1) return sum(x*x for x in data) total_cpu = 0.0 data_sets = [list(range(i, i+10000)) for i in range(0, 100000, 10000)] for data in data_sets: cpu_start = time.process_time() result = process_data(data) cpu_end = time.process_time() total_cpu += cpu_end - cpu_start print(f"Processed set, result: {result}") print(f"\nTotal CPU time: {total_cpu:.4f} seconds") print(f"Average per set: {total_cpu/len(data_sets):.6f} seconds")
跟踪累积 CPU 时间有助于识别跨多个操作或数据集的性能趋势。
此模式对于批量处理系统很有用,在这些系统中,了解总资源使用情况非常重要。
比较算法
此示例使用 process_time
来比较解决相同问题的不同算法的 CPU 效率。
import time def factorial_recursive(n): return 1 if n <= 1 else n * factorial_recursive(n-1) def factorial_iterative(n): result = 1 for i in range(1, n+1): result *= i return result def measure_factorial(func, n, name): start = time.process_time() result = func(n) duration = time.process_time() - start print(f"{name} ({n}): {duration:.6f} sec") return result n = 900 rec_result = measure_factorial(factorial_recursive, n, "Recursive") iter_result = measure_factorial(factorial_iterative, n, "Iterative") assert rec_result == iter_result
CPU 时间测量为算法选择提供了客观数据。 此示例比较了递归与迭代阶乘实现。
在优化关键代码路径时,这种比较非常有价值,因为效率上的微小差异很重要。
随时间推移监控 CPU 使用率
此示例演示了如何通过按间隔采样来监控长时间运行的操作期间的 CPU 使用率模式。
import time import random def long_running_task(): # Simulate mixed CPU and I/O workload for i in range(10): # CPU-intensive phase start_phase = time.process_time() sum(x*x for x in range(1000000 * (i+1))) cpu_time = time.process_time() - start_phase # Report phase statistics print(f"Phase {i+1}: CPU time {cpu_time:.3f} sec") # Simulate I/O wait time.sleep(random.random()) # Start monitoring print("Starting task monitoring...") start_total = time.process_time() long_running_task() total_cpu = time.process_time() - start_total print(f"\nTotal CPU time: {total_cpu:.3f} seconds")
此技术有助于识别长时间运行的进程中 CPU 密集型活动的阶段。 数据可以指导优化工作。
通过按阶段细分 CPU 使用率,您可以将优化工作重点放在影响最大的地方。
最佳实践
- 用例: 对于 CPU 密集型性能测量,首选 process_time
- 精度: 提供高分辨率 CPU 时间测量
- 睡眠时间: 不计入睡眠或等待时间
- 多核: 跨所有线程/内核求和 CPU 时间
- 子进程: 不包括子进程 CPU 时间
资料来源
作者
列出所有 Python 教程。