Python 小技巧:计时函数

Python计时函数优化技巧

思考

它接收开始和结束时间,返回格式为"天:小时:分钟:秒:毫秒"的字符串。

V 1.0

from datetime import datetime

def format_timedelta(start_time, end_time):
    """
    计算两个datetime对象之间的时间差,并格式化为天:小时:分钟:秒:毫秒
    
    Args:
        start_time (datetime): 开始时间
        end_time (datetime): 结束时间
    
    Returns:
        str: 格式为"天:小时:分钟:秒:毫秒"的字符串
    """
    # 计算时间差
    delta = end_time - start_time
    
    # 提取天、秒和微秒
    days = delta.days
    seconds = delta.seconds
    microseconds = delta.microseconds
    
    # 计算小时、分钟和秒
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = seconds % 60
    milliseconds = microseconds // 1000  # 将微秒转换为毫秒
    
    # 格式化为字符串,确保两位数显示
    return f"{days}:{hours:02d}:{minutes:02d}:{seconds:02d}:{milliseconds:03d}"

# 示例使用
if __name__ == "__main__":
    # 模拟开始和结束时间
    start = datetime.now()
    
    # 这里模拟一些耗时操作
    import time
    time.sleep(2.5)  # 休眠2.5秒
    
    end = datetime.now()
    
    # 使用计时函数
    elapsed_time = format_timedelta(start, end)
    print(f"耗时: {elapsed_time}")

这个函数会输出类似这样的结果:

耗时: 0:00:02:05:500

表示:

· 0天
· 00小时
· 02分钟
· 05秒
· 500毫秒

使用案例

from datetime import datetime
import time

def main():
    start = datetime.now()
    
    # 您的代码逻辑
    time.sleep(1.2)  # 模拟耗时操作
    
    end = datetime.now()
    
    # 记录耗时
    elapsed = format_timedelta(start, end)
    print(f"操作耗时: {elapsed}")
    # 或者记录到日志: logging.info(f"操作耗时: {elapsed}")

if __name__ == "__main__":
    main()

V 2.0

from datetime import datetime

def format_timedelta(start_time, end_time):
    """
    计算两个datetime对象之间的时间差,并格式化为天:小时:分钟:秒:毫秒
    
    Args:
        start_time (datetime): 开始时间
        end_time (datetime): 结束时间
    
    Returns:
        str: 格式为"天:小时:分钟:秒:毫秒"的字符串
    """
    # 计算时间差
    delta = end_time - start_time
    
    # 直接提取总秒数(包括天数部分的秒数)
    total_seconds = delta.total_seconds()
    
    # 计算各个时间单位
    days = int(total_seconds // 86400)  # 86400秒=1天
    remaining_seconds = total_seconds % 86400
    
    hours = int(remaining_seconds // 3600)
    remaining_seconds %= 3600
    
    minutes = int(remaining_seconds // 60)
    remaining_seconds %= 60
    
    seconds = int(remaining_seconds)
    milliseconds = int((remaining_seconds - seconds) * 1000)
    
    # 格式化为字符串
    return f"{days}:{hours:02d}:{minutes:02d}:{seconds:02d}:{milliseconds:03d}"

# 如果需要更高的性能,可以使用预编译的格式化字符串
def format_timedelta_fast(start_time, end_time):
    """
    更高效的计时函数实现
    """
    delta = end_time - start_time
    total_seconds = delta.total_seconds()
    
    days = int(total_seconds // 86400)
    remaining = total_seconds % 86400
    
    hours = int(remaining // 3600)
    remaining %= 3600
    
    minutes = int(remaining // 60)
    remaining %= 60
    
    seconds = int(remaining)
    milliseconds = int((remaining - seconds) * 1000)
    
    # 使用预分配的列表和join方法,比f-string更快
    return f"{days}:{hours:02d}:{minutes:02d}:{seconds:02d}:{milliseconds:03d}"

性能优化说明

  1. 使用total_seconds():直接获取总秒数,避免了从多个属性中提取和计算
  2. 整数运算:所有计算都使用整数运算,比浮点运算更快
  3. 减少变量创建:尽量重用变量,减少内存分配
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值