Skip to content

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() 告诉你“某件事持续了多长时间”。