Appearance
time.perf_counter()
和 time.time()
都是 Python time
模块中用于获取时间的功能,但它们的设计目的、返回值的参考点以及对系统时钟调整的响应方式有本质的区别。
time.time()
- 功能: 返回当前时间戳,即从纪元 (Epoch)(通常是 1970 年 1 月 1 日 00:00:00 UTC)到现在的秒数。这是一个浮点数。
- 参考点: 纪元时间,它是系统范围的、绝对的时间。
- 精度: 通常是微秒 (microseconds) 级别,但具体精度取决于操作系统。
- 受系统时钟影响: 会受系统时钟调整(例如,手动更改时间、NTP 时间同步、夏令时调整等)的影响。这意味着
time.time()
返回的值可能会向前跳跃或向后回溯。 - 用途:
- 生成时间戳,用于日志记录、文件命名、数据存储等。
- 与数据库或网络服务进行时间同步。
- 需要 "挂钟时间"(wall-clock time)的场景。
示例:
python
import time
current_time = time.time()
print(f"time.time() 返回值: {current_time}")
# 示例输出: time.time() 返回值: 1678886400.123456
time.perf_counter()
- 功能: 返回一个高分辨率的性能计数器的当前值(以秒为单位)。这个计数器旨在测量短时间间隔,并且它是一个单调递增的值。
- 参考点: 起始点是任意的,通常是系统启动时间或程序启动时间,但这个起始点是未定义的,并且在不同系统或不同程序执行中可能不同。它与具体的日期和时间无关。
- 精度: 通常是可用的最高分辨率的时钟,比
time.time()
更高。 - 受系统时钟影响: 不会受系统时钟调整的影响。由于它是单调递增的,所以即使系统时间被改动,
perf_counter()
也只会向前走,不会回溯,这使得它非常适合测量持续时间。 - 用途:
- 测量代码执行时间(例如,函数运行了多长时间,一段代码块的性能)。
- 基准测试 (benchmarking)。
- 性能分析 (profiling)。
- 任何需要精确测量时间间隔的场景。
示例:
python
import time
start_time = time.perf_counter()
# 模拟一些耗时操作
sum(range(10000000))
time.sleep(0.1) # 暂停0.1秒
end_time = time.perf_counter()
duration = end_time - start_time
print(f"time.perf_counter() 启动时间: {start_time}")
print(f"time.perf_counter() 结束时间: {end_time}")
print(f"操作持续时间: {duration:.6f} 秒")
# 示例输出:
# time.perf_counter() 启动时间: 234567.89012345
# time.perf_counter() 结束时间: 234568.01234567
# 操作持续时间: 0.122222 秒
核心区别总结
特性 | time.time() | time.perf_counter() |
---|---|---|
参考点/基准 | 纪元 (Epoch, 1970-01-01 UTC) | 任意,通常是系统启动或程序启动 |
单调性 | 否 (可回溯或跳跃) | 是 (始终单调递增,不会回溯) |
时钟调整影响 | 受影响 (NTP, 手动修改) | 不受影响 |
主要用途 | 绝对时间戳、日志、日期/时间计算 | 测量持续时间、代码性能、基准测试 |
返回类型 | 浮点数 (秒) | 浮点数 (秒) |
精度 | 通常高 (微秒级) | 通常更高 (操作系统最高可用精度) |
何时使用哪个?
- 当你需要一个绝对的时间点,例如记录事件发生的时间、生成日志时间戳、或者计算两个日期之间的间隔(与日历时间相关)时,请使用
time.time()
。 - 当你需要精确测量代码执行的持续时间,或者进行性能分析、基准测试时,请始终使用
time.perf_counter()
。因为它不受系统时钟调整的影响,能提供更可靠、更稳定的时间间隔测量。
一句话总结:time.time()
告诉你“现在是几点”,而 time.perf_counter()
告诉你“某件事持续了多长时间”。