Python time.thread_time 函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨 Python 的 time.thread_time
函数,该函数返回当前线程的 CPU 时间。我们将涵盖线程特定的计时、性能测量和实际示例。
基本定义
time.thread_time
函数以秒为单位返回当前线程的 CPU 时间,以浮点数表示。 它测量在当前线程中执行所花费的时间。
主要特征:线程特定的 CPU 时间,不包括睡眠时间,可用于性能分析。 参考点未定义,因此只有差异才有意义。
基本线程时间测量
此示例显示了 thread_time
的基本用法,用于测量当前线程在计算期间消耗的 CPU 时间。
import time def compute(): sum(range(10**6)) # CPU-intensive work start = time.thread_time() compute() end = time.thread_time() print(f"CPU time used: {end - start:.6f} seconds")
这仅测量当前线程中花费的 CPU 时间。 睡眠时间或其他线程的工作不会影响测量。
精度取决于平台,但通常为纳秒级。 只能比较时间差。
比较线程时间与进程时间
此示例将 thread_time
与 process_time
进行比较,以显示线程特定的 CPU 时间测量与进程范围的 CPU 时间测量。
import time import threading def worker(): start_thread = time.thread_time() start_process = time.process_time() sum(range(10**7)) # CPU work end_thread = time.thread_time() end_process = time.process_time() print(f"Thread CPU: {end_thread - start_thread:.3f}s") print(f"Process CPU: {end_process - start_process:.3f}s") # Create and start two threads t1 = threading.Thread(target=worker) t2 = threading.Thread(target=worker) t1.start() t2.start() t1.join() t2.join()
thread_time
仅测量调用线程的 CPU 时间,而 process_time
包括进程中的所有线程。
在分析多线程应用程序时,这种区别至关重要。
测量 I/O 密集型操作与 CPU 密集型操作
此示例演示了 thread_time
如何区分线程中的 CPU 密集型操作和 I/O 密集型操作。
import time def mixed_work(): # CPU-bound work start_cpu = time.thread_time() sum(range(10**6)) end_cpu = time.thread_time() # I/O-bound work (sleep simulates waiting) start_io = time.thread_time() time.sleep(1) end_io = time.thread_time() print(f"CPU work time: {end_cpu - start_cpu:.6f}s") print(f"I/O wait time: {end_io - start_io:.6f}s") mixed_work()
睡眠时间不计入线程 CPU 时间,这表明 thread_time
仅测量实际 CPU 使用率。
这有助于识别线程是 CPU 密集型还是等待 I/O 操作。
分析函数执行
此示例创建一个装饰器,该装饰器使用 thread_time
分析函数,以测量其 CPU 消耗。
import time def profile(func): def wrapper(*args, **kwargs): start = time.thread_time() result = func(*args, **kwargs) end = time.thread_time() print(f"{func.__name__} used {end - start:.6f}s CPU time") return result return wrapper @profile def factorial(n): if n == 0: return 1 return n * factorial(n - 1) @profile def sleep_and_compute(): time.sleep(0.5) sum(range(10**6)) factorial(10) sleep_and_compute()
装饰器仅测量函数使用的 CPU 时间,不包括任何等待时间或其他线程中的时间。
这对于识别多线程应用程序中的 CPU 密集型函数特别有用。
比较线程性能
此示例使用 thread_time
比较同一任务的不同线程实现的 CPU 消耗。
import time import threading def worker_optimized(): start = time.thread_time() # Efficient computation sum(i*i for i in range(10**6)) end = time.thread_time() print(f"Optimized: {end - start:.6f}s") def worker_unoptimized(): start = time.thread_time() # Less efficient computation total = 0 for i in range(10**6): total += i*i end = time.thread_time() print(f"Unoptimized: {end - start:.6f}s") t1 = threading.Thread(target=worker_optimized) t2 = threading.Thread(target=worker_unoptimized) t1.start() t2.start() t1.join() t2.join()
通过分别测量每个线程的 CPU 时间,我们可以比较并发运行的不同实现的效率。
这种方法有助于识别多线程代码中的性能优化。
随着时间的推移监控线程 CPU 使用率
此示例演示如何使用 thread_time
通过定期采样来监控线程随时间的 CPU 使用率。
import time import threading def worker(): last_time = time.thread_time() for i in range(5): # Do some work sum(range(10**6)) current_time = time.thread_time() cpu_used = current_time - last_time print(f"Interval {i}: {cpu_used:.3f}s CPU time") last_time = current_time # Simulate mixed workload time.sleep(0.2) thread = threading.Thread(target=worker) thread.start() thread.join()
通过进行定期测量,我们可以跟踪线程执行期间 CPU 使用率的变化情况。
此技术对于识别长时间运行的线程中 CPU 使用率高的阶段很有用。
最佳实践
- 线程特定: 仅用于测量单个线程的 CPU 时间
- 相对测量: 只有调用之间的差异才有意义
- 精度: 提供用于性能分析的高分辨率计时
- 睡眠时间: 不包括线程未运行的时间
- 多线程: 非常适合分析并发应用程序
资料来源
作者
列出所有 Python 教程。