Python性能分析利器:用装饰器实现毫秒级函数执行时间追踪

第一章:Python性能分析与装饰器概述

在构建高效 Python 应用程序时,理解代码执行的性能瓶颈至关重要。性能分析帮助开发者识别耗时操作,优化关键路径,而装饰器则提供了一种优雅的方式来增强函数行为,无需修改其原始逻辑。结合二者,可以在不侵入业务代码的前提下实现监控、计时和日志记录等功能。

性能分析的基本方法

Python 内置的 cProfile 模块是分析程序性能的常用工具。通过命令行或编程方式调用,可获取函数调用次数、累计执行时间等详细信息。例如:
import cProfile
import pstats

def example_function():
    total = sum(i * i for i in range(10000))
    return total

# 性能分析
profiler = cProfile.Profile()
profiler.enable()
example_function()
profiler.disable()

# 打印统计结果
stats = pstats.Stats(profiler)
stats.sort_stats('cumtime')
stats.print_stats(5)
上述代码启用性能分析器,执行目标函数后输出耗时最长的前5个函数调用。

装饰器的作用与优势

装饰器本质上是一个接受函数作为参数并返回新函数的高阶函数。它常用于添加横切关注点,如权限校验、缓存或性能计时。
  • 提升代码复用性,避免重复逻辑
  • 保持原函数纯净,符合单一职责原则
  • 支持组合多个装饰器以叠加功能
以下是一个简单的计时装饰器示例:
import time
from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} 执行耗时: {end - start:.4f}s")
        return result
    return wrapper

@timer
def slow_operation():
    time.sleep(1)

slow_operation()  # 输出: slow_operation 执行耗时: 1.00s
特性说明
非侵入性无需修改被装饰函数内部逻辑
可配置性支持带参数的装饰器实现灵活控制
调试友好使用 @wraps 保留原函数元信息

第二章:装饰器基础与时间追踪原理

2.1 装饰器的核心机制与闭包解析

装饰器的本质是高阶函数,它接收一个函数作为参数,并返回一个新的函数。这一过程依赖于闭包机制,使得内部函数可以访问外部函数的变量,并维持其生命周期。
闭包的基本结构
def outer(x):
    def inner():
        return x ** 2
    return inner

func = outer(5)
print(func())  # 输出: 25
在此例中,inner 函数捕获了 outer 的局部变量 x,形成闭包。即使 outer 执行完毕,x 仍被保留在内存中。
装饰器的工作流程
装饰器通过 @ 语法糖实现函数增强:
  • 原函数被传入装饰器函数
  • 装饰器返回一个包装后的函数
  • 调用时执行增强逻辑
def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def greet(name):
    print(f"Hello, {name}")

greet("Alice")
上述代码中,log_decorator 利用闭包保留对 func 的引用,wrapper 在运行时添加日志行为后调用原函数。

2.2 函数元信息保留与functools.wraps应用

在使用装饰器增强函数功能时,原始函数的元信息(如函数名、文档字符串、参数签名)可能被包装函数覆盖。这会影响调试和自省操作。
问题示例
def log_calls(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_calls
def greet(name):
    """欢迎用户"""
    print(f"Hello, {name}")

print(greet.__name__)  # 输出: wrapper(非期望值)
上述代码中,greet.__name__ 变为 wrapper,丢失原函数名称。
解决方案:functools.wraps
使用 functools.wraps 可保留原函数元信息:
from functools import wraps

def log_calls(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper
@wraps(func) 会复制 __name__、__doc__、__module__ 等属性到包装函数,确保元数据一致性,提升可维护性。

2.3 高精度计时方法选择:time vs timeit

在Python中进行性能测量时,time和timeit模块提供了不同的计时策略。虽然time.time()简单直观,但受系统时钟分辨率影响,精度较低。
核心差异分析
timeit模块专为短时操作设计,通过多次执行取最小值来减少误差,并禁用垃圾回收以提升准确性。
import timeit

def test_function():
    return sum(range(100))

# 使用timeit进行高精度计时
execution_time = timeit.timeit(test_function, number=1000)
print(f"平均执行时间: {execution_time / 1000:.6f} 秒")
上述代码中,number=1000表示执行1000次,返回总耗时。相比单次测量,能更真实反映函数性能。
适用场景对比
  • time:适用于粗粒度、长时间间隔的测量
  • timeit:适合微秒级短操作,如算法性能对比

2.4 实现一个基础的执行时间统计装饰器

在Python中,装饰器是增强函数功能的有力工具。通过实现一个执行时间统计装饰器,可以非侵入式地监控函数性能。
基本实现结构
使用functools.wraps保留原函数元信息,结合time模块记录函数调用前后的时间差。
import time
import functools

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} 执行耗时: {end - start:.4f}s")
        return result
    return wrapper
上述代码中,time.perf_counter()提供高精度时间戳,functools.wraps确保装饰后函数名、文档等属性不变。装饰器返回包装函数wrapper,在调用前后进行时间采样并输出差值。
使用示例
  • 被装饰函数:@timer 可应用于任意函数
  • 输出结果包含函数名和精确到毫秒级的执行时间

2.5 装饰器参数化:支持自定义日志输出

在实际开发中,不同场景对日志的需求各异。通过参数化装饰器,可灵活指定日志的输出格式与目标。
带参数的装饰器结构
参数化装饰器本质上是三层函数嵌套,最外层接收装饰器参数,中间层接收被装饰函数,内层执行增强逻辑。

def log_to(level="INFO", target="console"):
    def decorator(func):
        def wrapper(*args, **kwargs):
            message = f"[{level}] Calling {func.__name__}"
            if target == "console":
                print(message)
            elif target == "file":
                with open("log.txt", "a") as f:
                    f.write(message + "\n")
            return func(*args, **kwargs)
        return wrapper
    return decorator
上述代码中,log_to 接收 level 和 target 参数,动态控制日志级别与输出位置。decorator 内部封装原函数,wrapper 执行前插入日志逻辑。
使用示例
  • @log_to("DEBUG", "file"):将调试信息写入文件;
  • @log_to("WARNING", "console"):在控制台输出警告。

第三章:性能数据采集与处理

3.1 多次运行统计:最小值、平均值与标准差

在性能测试中,单次运行结果易受噪声干扰,需通过多次运行获取稳定指标。常用统计量包括最小值、平均值和标准差,分别反映最佳表现、集中趋势与波动程度。
统计指标的意义
  • 最小值:体现系统在最优状态下的响应能力
  • 平均值:衡量整体性能水平
  • 标准差:评估数据离散度,越小说明运行越稳定
Python 示例代码
import numpy as np

# 模拟5次运行的耗时(毫秒)
times = [102, 98, 110, 100, 95]

min_time = np.min(times)        # 最小值
mean_time = np.mean(times)      # 平均值
std_time = np.std(times)        # 标准差

print(f"Min: {min_time:.2f}ms, Mean: {mean_time:.2f}ms, Std: {std_time:.2f}ms")
该代码使用 NumPy 快速计算三个关键统计量。其中标准差小于5ms时通常认为系统稳定性良好,适用于高精度性能分析场景。

3.2 时间单位自动转换与格式化输出

在处理时间数据时,常需将秒、毫秒或纳秒等不同单位统一转换为可读性更强的格式。通过程序化方式实现自动单位识别与转换,能显著提升日志、监控和性能分析系统的用户体验。
支持的时间单位
系统支持以下常见时间单位的自动识别与转换:
  • 纳秒(ns)
  • 微秒(μs)
  • 毫秒(ms)
  • 秒(s)
Go语言实现示例
func formatDuration(nano int64) string {
    switch {
    case nano < 1000:
        return fmt.Sprintf("%d ns", nano)
    case nano < 1e6:
        return fmt.Sprintf("%.2f μs", float64(nano)/1e3)
    case nano < 1e9:
        return fmt.Sprintf("%.2f ms", float64(nano)/1e6)
    default:
        return fmt.Sprintf("%.2f s", float64(nano)/1e9)
    }
}
该函数根据数值大小自动选择最合适的时间单位,并保留两位小数以增强可读性。参数 nano 表示以纳秒为单位的时间值,输出为格式化的字符串。
转换精度对照表
原始值(纳秒)输出格式
450450 ns
123456123.46 μs
876543210876.54 ms

3.3 将性能数据写入文件或数据库

在系统性能监控中,采集到的性能数据需要持久化存储以便后续分析。常见的持久化方式包括写入本地文件和存储至数据库。
写入本地文件
将性能指标以结构化格式(如JSON、CSV)写入日志文件,适用于轻量级监控场景。以下为Go语言示例:
file, _ := os.OpenFile("perf.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
data := fmt.Sprintf("%s CPU:%.2f%% Mem:%.2f%%\n", time.Now().Format(time.RFC3339), cpuUsage, memUsage)
file.WriteString(data)
file.Close()
该代码将时间戳、CPU与内存使用率按行追加写入日志文件,结构清晰,便于后期解析。
写入数据库
对于高频率、大规模的数据采集,推荐使用时序数据库(如InfluxDB)或关系型数据库。通过预定义表结构实现高效写入:
字段名类型说明
timestampDATETIME采样时间
cpu_usageFLOATCPU使用率(%)
mem_usageFLOAT内存使用率(%)
结合连接池与批量提交机制,可显著提升写入效率并降低系统开销。

第四章:高级功能与实际应用场景

4.1 结合logging模块实现分级日志记录

在Python中,logging模块提供了灵活的日志控制机制,支持DEBUG、INFO、WARNING、ERROR、CRITICAL五个级别,便于不同环境下的问题追踪。
日志级别与用途
  • DEBUG:详细信息,诊断问题时使用
  • INFO:确认程序按预期运行
  • WARNING:潜在问题警告
  • ERROR:功能失败记录
  • CRITICAL:严重错误
配置分级日志输出
import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("app.log"),
        logging.StreamHandler()
    ]
)

logging.debug("调试信息")
logging.info("服务启动")
logging.warning("磁盘空间不足")
上述代码通过basicConfig设置最低记录级别为DEBUG,并同时输出到文件和控制台。handlers机制实现了多目标日志分发,便于生产环境监控与调试分离。

4.2 使用上下文管理器增强装饰器灵活性

在复杂的应用场景中,装饰器常需与资源管理结合。通过集成上下文管理器(`contextlib`),可实现执行前后自动初始化和清理资源,显著提升装饰器的灵活性与安全性。
上下文管理器与装饰器协同工作
利用 `@contextmanager` 装饰器定义自定义上下文,可在函数调用前后注入预处理和收尾逻辑:

from contextlib import contextmanager
import time

@contextmanager
def timing():
    start = time.time()
    try:
        yield
    finally:
        print(f"耗时: {time.time() - start:.2f}s")

def timed(func):
    def wrapper(*args, **kwargs):
        with timing():
            return func(*args, **kwargs)
    return wrapper

@timed
def slow_task():
    time.sleep(1)
上述代码中,`timing` 上下文管理器负责计时,`timed` 装饰器将其封装为可复用逻辑。调用 `slow_task()` 时自动输出执行时间,实现了关注点分离。
优势分析
  • 资源安全:确保异常时仍能正确释放资源
  • 逻辑复用:上下文可被多个装饰器或函数共享
  • 结构清晰:将横切关注点模块化,提升代码可维护性

4.3 在Web框架中集成时间追踪(以Flask为例)

在现代Web应用开发中,性能监控是保障系统稳定性的关键环节。Flask作为轻量级Python Web框架,可通过中间件机制轻松集成时间追踪功能。
请求耗时监控中间件
通过定义一个简单的装饰器或应用钩子,可以记录每个请求的处理时间:

import time
from flask import request

@app.before_request
def start_timer():
    request.start_time = time.time()

@app.after_request
def log_request_duration(response):
    if hasattr(request, 'start_time'):
        duration = time.time() - request.start_time
        print(f"Request to {request.path} took {duration:.4f}s")
    return response
上述代码利用Flask提供的before_request和after_request钩子,在请求开始前记录时间戳,并在响应返回后计算耗时。该方法无需修改业务逻辑,具有良好的可维护性。
性能数据采集建议
  • 将耗时日志输出至结构化日志系统以便后续分析
  • 结合用户身份、接口路径等上下文信息增强追踪能力
  • 对异常请求或超时请求设置告警阈值

4.4 并发环境下装饰器的线程安全考量

在高并发场景中,装饰器若操作共享状态,可能引发竞态条件。确保线程安全需对内部状态进行同步控制。
数据同步机制
使用互斥锁保护共享资源是常见做法。以下为 Python 中线程安全装饰器的实现示例:

import threading
from functools import wraps

def synchronized(func):
    func.__lock__ = threading.RLock()
    
    @wraps(func)
    def synced_func(*args, **kwargs):
        with func.__lock__:
            return func(*args, **kwargs)
    return synced_func
上述代码通过 threading.RLock() 为每个函数绑定独占锁,确保同一时间仅一个线程可执行被装饰函数。装饰器自身不维护外部状态,避免了模块级变量带来的全局竞争。
装饰器状态管理策略
  • 避免在装饰器闭包中使用可变全局变量
  • 优先采用线程局部存储(threading.local())隔离上下文数据
  • 若需缓存,应使用线程安全结构如 queue.Queue 或加锁字典

第五章:总结与性能优化建议

合理使用连接池配置
在高并发场景下,数据库连接管理直接影响系统吞吐量。以 Go 语言为例,通过调整 SetMaxOpenConns 和 SetMaxIdleConns 可显著减少连接开销:
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(time.Hour)
某电商平台在秒杀活动中应用此配置后,数据库连接等待时间下降 68%。
缓存策略优化
采用多级缓存架构可有效降低后端压力。以下为典型缓存层级设计:
  • 本地缓存(如 Redis 或 Caffeine)用于高频读取数据
  • 分布式缓存处理跨节点共享状态
  • CDN 缓存静态资源,减少源站请求
某新闻门户通过引入本地缓存 + Redis 集群,将热点文章访问延迟从 45ms 降至 9ms。
SQL 查询性能调优
不合理查询是性能瓶颈的常见根源。应定期审查执行计划并建立索引策略。以下是常见优化对比:
优化项优化前优化后
查询响应时间320ms45ms
全表扫描是否
索引命中无复合索引 (status, created_at)
异步处理提升响应能力
将非核心逻辑(如日志记录、通知发送)移至消息队列,可显著提高主流程响应速度。
系统架构中引入 Kafka 后,订单创建 P99 延迟由 820ms 降至 210ms。

相关推荐

TensorFlow Callbacks实战指南:训练生命周期监控与干预

Callback是Keras训练流程中嵌入式探针,本质是模型训练生命周期的实时监控与动态干预机制。它基于事件钩子(如on_batch_end、on_epoch_begin)在训练图内联执行,提供毫秒级指标同步、跨batch状态保持和零并发风险的工程保障。其技术价值在于将黑盒训练转化为可观测、可调试、可干预的确定性过程,支撑梯度监控、学习率自适应、早停决策、日志聚合等核心能力。广泛应用于推荐系统、工业质检、金融风控等需高稳定性和可解释性的AI生产场景。本文聚焦tf.keras.callbacks.Callba

weixin_33726313的博客 387

python profiler_Python 性能调试工具Line-profiler极简使用笔记

虽然Python屡屡被人诟病速度问题,但是该用的还得用,速度问题只能靠代码优化来解决了。Line-Profiler是一个代码优化工具,利用line—profiler我们可以得到我们每一行代码的运行总时间以及单次平均运行时间,以便我们对耗时最长的地方进行优化。1、极简模式下面我们使用line-profiler查看一个简单实例各行代码时间都花在哪。import randomdef do_stuff()...

weixin_39646831的博客 609

MLOps生产实战:模型封装、服务化与监控铁三角

机器学习模型部署不是简单导出和API化,而是涉及模型封装、高可用服务构建与全栈监控的系统工程。其核心原理在于通过标准化格式(如ONNX)实现环境隔离与跨平台兼容,借助容器化与执行器调优保障推理性能与稳定性,并依托分层监控(基础设施/服务/模型)实现故障快速定位与根因分析。技术价值体现在提升模型上线成功率、降低运维成本、增强业务连续性;典型应用场景包括推荐系统、风控引擎、实时用户画像等需7×24小时稳定运行的AI服务。本文聚焦真实生产环境中模型从Notebook到Kubernetes集群落地的关键实践,涵盖O

jlins_you的专栏 368

Python 中耗时计算,将秒、毫秒转换为年月日、时分秒的标准输出

1、入参后的冒号“:”是该参数的注释;如题,耗时计算为更好的用户体验。原因是避免函数调用时出错。

709

openEuler系统下安装Google Chrome浏览器全攻略(附依赖问题解决方案)

本文详细介绍了在openEuler系统上安装Google Chrome浏览器的完整指南,包括环境准备、多种安装方式、依赖问题解决方案及性能优化技巧。针对openEuler特有的软件生态和依赖管理机制,提供了实用的命令和配置方法,帮助用户克服安装过程中的常见障碍,实现流畅的Chrome使用体验。

hadoop5ranger的博客 1148

学习记录(十一)--Pattern Recognition投稿记录

上一周特别忽然通知统计建模要答辩,确定是否晋级国赛,一直在准备答辩的事情,所以上一周没有总结周汇报,深刻检讨!!!不过结果是好的,我们组第二名晋级哦。这周主要是跟大家分享一下我投稿PR(Pattern Recognition)的一个时间线,以及投稿后的工作。一、PR从投稿到接收的时间线2025.4.3 Major Revision(ddl4.23) 当时正在弄比赛和另一个着急推进的文章2025.5.30 Minor Revision 这次小修基本上只有一些格式和简单一点点问题。

qq_54949944的博客 1918

Python计算程序运行时间秒级/毫秒级的两种方法datetime和time

Python计算程序运行时间秒级/毫秒级的两种方法datetime和time 简单粗暴,先上代码: import datetime import time # 方法一:datetime.datetime.now() 时间和日期的结合 eg: 2021-10-15 14:19:27.875779 start_dt = datetime.datetime.now() print("start_datetime:", start_dt) time.sleep(2) for i in range(10000):

qq_39691492的博客 2万+

如何编写 Skill 实现自动化用例生成

Skill 本质上是一组结构化的指令和工具定义,它告诉 AI 模型在特定场景下应该遵循什么流程、调用哪些工具、输出什么格式的内容。元信息:名称、描述、版本等。指令(Instructions):定义 AI 的行为准则和任务流程。工具(Tools):AI 可以调用的外部能力,如文件读写、代码执行、API 请求等。上下文(Context):预设的输入输出格式或示例。编写一个用于自动生成测试用例的 Skill,核心在于定义清晰的指令流程和输出规范。

Cesare的博客 2692

python装饰器计算程序运行时间

import time def count_time(func): def int_time(*args, **kwargs): start_time = time.time()#这个是程序开始时间 func() over_time = time.time()#这个是程序结束时间 total_time = over_tim...

weixin_43226574的博客 1275

岭回归的MATLAB步骤

MATLAB 实现框架,它涵盖了从数据导入到岭回归的步骤,包括计算共线性、使用 MAE、MSE、R²、MAPE 进行评价,以及绘制相应的可视化图表。

subject625Ruben的博客 1089

在linux上本地大模型部署与推理

您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2054

Pandas三大性能陷阱:循环遍历、链式赋值与内存泄漏

Pandas作为数据科学核心库,其高效性高度依赖对底层计算范式的理解。向量化操作依托NumPy的C实现与CPU SIMD指令,并行处理大幅提升吞吐;而显式for循环强制解释器逐行执行,引发索引开销、缓存失效与类型推断延迟。链式赋值因视图/副本不确定性导致静默失败,本质是Pandas写时复制(Copy-on-Write)机制未完全收敛所致。临时对象滥用与隐式引用则绕过Python垃圾回收节奏,造成内存持续驻留。这些现象在中等规模数据(10万+行)下即显著拖慢ETL、特征工程与模型服务响应。本文聚焦真实生产环境

weixin_30861797的博客 423

普冉PY32F002B ADC内部参考电压VREFINT的误差补偿与低功耗优化实践

本文详细介绍了普冉PY32F002B单片机在锂电池供电场景下ADC内部参考电压VREFINT的误差补偿与低功耗优化实践。通过分析GPIO配置、分压电阻匹配、采样时间设置等硬件设计要点,结合实时测量VREFINT电压值和软件补偿算法,有效提升了ADC测量精度至5mV以内,并实现了分压电路功耗控制与采样频率优化,为低成本消费电子项目提供了完整的解决方案。

846

python 计算耗时

print (datetime.datetime.now()) import time as tm t1 = tm.time() .......................t2 = tm.time()print "==========total take {0}".format(t2 - t1)

浪人的专栏 4845

全国排污许可证数据

from tkinter import * # 导入窗口控件 import tkinter.filedialog import requests from lxml import etree from tkinter import ttk from bs4 import BeautifulSoup import webbrowser # 调用浏览器打开网页 from tkinter import messagebox # 弹出提示框 from openpyxl import Workbook imp.

Newnotes的博客 3385

Autosar代码包初识 2 - 如何编译Vector包内Demo工程

Vetcor autosar代码包Demo工程编译,GreenHills,RH850,Autosar,Davinci COnfigurator

weixin_42412049的博客 5184

·Python 获取本地时间戳(包含毫秒)

Python 获取本地时间戳(包含毫秒)如何通过 Python 获取一个完整的时间戳。import time def get_time_stamp(): ct = time.time() local_time = time.localtime(ct) data_head = time.strftime("%Y-%m-%d %H:%M:%S", local_time) ...

Beyond_F4的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python 获取毫秒级时间问题

根据网上的一些说法,在python里获取ms级系统时间可以通过以下方式获取: import datetime print(datetime.datetime.now().microsecond) 但通过以下代码测试,发现返回的并不是ms的值,而是us的值: import datetime def getTime_ms(): return (datetime.datetime.n...

weixin_41698305的博客 6030

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python程序执行时间毫秒_【Python】求程序的运行时间

要记录程序的运行时间可以利用Unix系统中,1970.1.1到现在的时间的毫秒数,这个时间戳轻松完成。方法是程序开始的时候取一次存入一个变量,在程序结束之后取一次再存入一个变量,与程序开始的时间戳相减则可以求出。Python中取这个时间戳的方法为引入time类之后,使用time.time();就能够拿出来。也就是Java中的System.currentTimeMillis()。由于Python求当...

weixin_39987926的博客 2081

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

《Python - 实现一个简单的装饰器》--- 输出程序运行时间

主要结合程序认识理解Python中的装饰器。练习Python代码的编写。 简单代码#!/usr/bin/env python #-*- coding: utf-8 -*-""" @author: 烽火 @license: Apache Licence @file: decorate.py @time: 7/5/17 3:52 PM """ import time""" 定义简单的装饰器,用来输出程

IT痴者 3257

Python 获取本地时间戳(包含毫秒)

python time strftime

yenai2008的专栏 3万+

获取程序运行时间(精确到毫秒)

 LARGE_INTEGER litmp1,litmp2,litmp3;   LONGLONG QPart1=0,QPart2=0;    double dfMinus,dfFreq,dfTim;    QueryPerformanceFrequency(&litmp1);   //    获得计数器的时钟频率    dfFreq = (double)litmp1.QuadPart;    Que

小石头 1577

python计算程序运行时间毫秒_Python获取秒级时间戳与毫秒级时间戳方法

Python获取秒级时间戳与毫秒级时间戳方法importtimeimportdatetimecurrent_time=time.time()print(current_time)#原始时间数据>>>1515036769.15print(int(current_time))#秒级时间戳&...

weixin_35651578的博客 4649

python 计算程序运行时长(毫秒)

插入到程序首行 import datetime import time t1 = datetime.datetime.now().microsecond t2 = time.mktime(datetime.datetime.now().timetuple() 插入到程序末尾 t3 = datetime.datetime.now().microsecond t4 = time.mktime(datetime.datetime.now().timetuple()) strTime = 'funtion tim

w511410789的博客 1619

Python获取秒级时间戳与毫秒级时间戳

Python获取秒级时间戳与毫秒级时间戳 1、获取秒级时间戳与毫秒级时间戳、微秒级时间戳 import time import datetime t = time.time() print (t) #原始时间数据 print (int(t)) #秒级时间戳 print (int(round(t * 1000))) #毫秒级时间戳 print (int(round(t * 1000000))) #微秒级时间戳 返回

wangwang的博客 3994

Python3学习(二十八):python 如何获取毫秒级系统时间

在datetime模块,使用格式化符号 '%f'。 import datetime time_now = datetime.datetime.now().strftime('%H:%M:%S.%f') print(time_now) %H Hour (24-hour clock) as a decimal number [00,23]. %M Minute as a decimal nu...

技术宅拯救世界 3万+
上一篇: 负索引到底怎么用?,深入剖析Python字符串切片的隐藏规则与实战技巧
下一篇: 为什么你的Django模板加载慢?,深入剖析include性能瓶颈
CompiWander
博客等级 码龄1年 168粉丝 1980原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值