Python time.time 函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨了 Python 的 time.time 函数,该函数返回自 epoch 以来(即 1970 年 1 月 1 日 00:00:00 UTC)的当前时间(以秒为单位)。我们将介绍时间戳生成、性能测量和实际的计时示例。
基本定义
time.time 函数以浮点数形式返回自 epoch 以来(即 1970 年 1 月 1 日 00:00:00 UTC)的当前时间(以秒为单位)。
主要特点:平台相关的精度(通常为微秒)、在大多数系统上是单调递增的,并且可用于计时操作和日志记录。返回值是一个浮点数,以实现亚秒级精度。
基本时间戳生成
time.time 最简单的用法是生成当前时间戳。此示例展示了基本用法以及转换为其他时间格式。
import time
# Get current timestamp
timestamp = time.time()
print(f"Current timestamp: {timestamp}")
# Convert to readable format
local_time = time.localtime(timestamp)
print(f"Local time: {time.strftime('%Y-%m-%d %H:%M:%S', local_time)}")
# Convert to UTC
utc_time = time.gmtime(timestamp)
print(f"UTC time: {time.strftime('%Y-%m-%d %H:%M:%S', utc_time)}")
此示例演示了如何获取当前时间戳并将其转换为本地和 UTC 时间格式。时间戳是一个具有亚秒级精度的浮点数。
strftime 函数根据指定的格式代码将时间结构体格式化为人类可读的字符串。
测量代码执行时间
time.time 通常用于测量代码执行持续时间。此示例展示了如何以微秒精度对代码块进行计时。
import time
def slow_function():
# Simulate work
time.sleep(1.5)
# Start timer
start_time = time.time()
# Execute code to time
slow_function()
# Calculate duration
end_time = time.time()
duration = end_time - start_time
print(f"Function took {duration:.4f} seconds")
此模式对于性能测试非常有用。开始时间在执行之前捕获,结束时间在执行之后捕获。两者的差值给出持续时间。
:.4f 格式说明符显示持续时间,精确到小数点后 4 位,以实现毫秒精度。
将 Time.time 与 Time.perf_counter 进行比较
虽然 time.time 测量的是挂钟时间,但 time.perf_counter 为基准测试提供最高的可用分辨率。此示例比较了它们。
import time
def test_function():
sum(range(1000000))
# Using time.time()
start = time.time()
test_function()
end = time.time()
print(f"time.time(): {end - start:.6f} sec")
# Using time.perf_counter()
start = time.perf_counter()
test_function()
end = time.perf_counter()
print(f"time.perf_counter(): {end - start:.6f} sec")
time.time 受系统时钟更改的影响,而 perf_counter 是单调递增的,更适合短时间间隔。
对于大多数计时需求,首选 perf_counter,而 time 更适合实际时间戳。
创建超时
time.time 可以通过将当前时间与截止时间进行比较来实现超时。此示例展示了一个超时装饰器。
import time
def timeout(seconds):
def decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
elapsed = time.time() - start
if elapsed > seconds:
raise TimeoutError(f"Function exceeded {seconds} second timeout")
return result
return wrapper
return decorator
@timeout(2)
def potentially_slow_operation():
time.sleep(1.5) # Simulate work
return "Success"
print(potentially_slow_operation()) # Success
@timeout(1)
def too_slow_operation():
time.sleep(1.5)
return "Should timeout"
try:
too_slow_operation()
except TimeoutError as e:
print(f"Caught: {e}")
该装饰器测量执行时间,如果超过限制则引发异常。此模式对于强制执行操作的最大运行时非常有用。
请注意,这实际上并没有中断该函数 - 它只在完成后进行检查。对于真正的中断,请考虑使用线程。
使用 Time.time 进行速率限制
此示例使用 time.time 来跟踪和控制请求频率,从而实现速率限制。
import time
class RateLimiter:
def __init__(self, calls_per_second):
self.period = 1.0 / calls_per_second
self.last_call = 0
def __call__(self, func):
def wrapper(*args, **kwargs):
now = time.time()
elapsed = now - self.last_call
if elapsed < self.period:
time.sleep(self.period - elapsed)
self.last_call = time.time()
return func(*args, **kwargs)
return wrapper
@RateLimiter(2) # 2 calls per second max
def make_api_request():
print("API request made at", time.strftime("%H:%M:%S"))
for _ in range(5):
make_api_request()
RateLimiter 装饰器确保包装的函数不会以超过指定速率的频率调用。它会休眠以保持调用之间适当的间隔。
这对于具有速率限制的 API 或任何需要吞吐量控制的操作非常有用。
基于时间的缓存过期
time.time 可以通过将时间戳与缓存的值一起存储来实现缓存过期。此示例展示了一个简单的过期缓存。
import time
class ExpiringCache:
def __init__(self, ttl_seconds):
self.cache = {}
self.ttl = ttl_seconds
def get(self, key):
item = self.cache.get(key)
if item and time.time() - item['timestamp'] < self.ttl:
return item['value']
return None
def set(self, key, value):
self.cache[key] = {
'value': value,
'timestamp': time.time()
}
cache = ExpiringCache(5) # 5 second TTL
cache.set('data', 42)
print(cache.get('data')) # 42
time.sleep(6)
print(cache.get('data')) # None (expired)
缓存会在每次获取时检查项目的年龄与当前时间。超过 TTL(生存时间)的项目被认为是过期的并返回 None。
此模式对于临时数据存储非常有用,在这种情况下,新鲜度比持久性更重要。
最佳实践
- 精度需求: 使用 time.time 获取时间戳,使用 perf_counter 进行基准测试
- 时区: 请记住 time.time 返回 UTC 时间,请转换为本地时间
- 单调性: 对于计时间隔,请考虑使用单调时钟
- 浮点精度: 注意浮点精度限制
- 时钟更改: 系统时钟调整可能会影响 time.time
资料来源
作者
列出所有 Python 教程。