Python命令怎样统计脚本的执行时间 Python命令计时功能的基础教程

使用time.perf_counter()可进行高精度简单计时;2. 使用timeit模块能更精确测量代码段执行时间,适合性能比较;3. 避免测量开销、系统干扰、jit/缓存效应、i/o影响和未热启动等误区;4. 进阶性能分析可借助cprofile、snakeviz、line_profiler和memory_profiler等工具实现函数级、行级及内存使用深度分析,从而精准定位性能瓶颈并优化。

Python命令怎样统计脚本的执行时间 Python命令计时功能的基础教程

Python提供了多种方法来统计脚本的执行时间,最常用且基础的,无非就是利用内置的

time

模块或者更专业的

timeit

模块。前者胜在简单直观,适用于快速估算;后者则能提供更精确、更少干扰的计时结果,尤其适合对代码片段进行性能测试和比较。

解决方案

要统计Python脚本或代码段的执行时间,我们通常会用到以下几种方式。

1. 使用

time

模块进行简单计时

立即学习“Python免费学习笔记(深入)”;

这是最直接的方法,通过记录代码执行前后的时间戳,然后计算差值。我个人最常用的是

time.perf_counter()

,因它提供的是高精度计时器,最适合测量短时间间隔。

time.time()

也行,但它基于系统时钟,可能会受系统时间调整的影响。

import timedef my_slow_function():    """一个模拟耗时操作的函数"""    sum_val = 0    for i in range(10000000):        sum_val += i * i    return sum_val# 记录开始时间start_time = time.perf_counter()# 执行你的脚本或代码段result = my_slow_function()# 记录结束时间end_time = time.perf_counter()# 计算并打印执行时间execution_time = end_time - start_timeprint(f"函数执行结果: {result}")print(f"脚本执行时间: {execution_time:.6f} 秒")# 如果想用time.time(),原理一样# start_time_wall = time.time()# my_slow_function()# end_time_wall = time.time()# print(f"脚本执行时间 (time.time): {end_time_wall - start_time_wall:.6f} 秒")

2. 使用

timeit

模块进行精确计时和性能比较

timeit

模块是Python标准库中专门用于测量小段代码执行时间的工具。它会自动运行多次代码,并去除最高和最低值,以提供更稳定、更精确的平均执行时间,同时还能处理代码的设置(setup)部分,避免重复导入等干扰。

你可以直接在Python脚本中使用

timeit.timeit()

函数:

import timeit# 定义要测试的代码字符串code_to_test = """sum_val = 0for i in range(10000000):    sum_val += i * i"""# 定义设置代码字符串(例如导入模块或定义函数)setup_code = """# 如果my_slow_function定义在外部,需要在这里导入# from __main__ import my_slow_function"""# 执行计时,默认运行1,000,000次,这里为了快点,我们设置少一点# number 参数指定了每个循环中代码执行的次数# repeat 参数指定了计时器重复运行整个测试的次数# timeit.timeit(stmt, setup, timer, number)# timeit.repeat(stmt, setup, timer, repeat, number)times = timeit.repeat(stmt=code_to_test, setup=setup_code, number=1, repeat=5)print(f"代码执行时间 (重复5次,每次执行1次): {min(times):.6f} 秒 (最短时间)")print(f"所有执行时间: {[f'{t:.6f}' for t in times]}")# 如果要测试一个函数,可以这样写def another_slow_function():    return sum(range(10000000))# 注意 setup='from __main__ import another_slow_function'# 这样 timeit 才能找到这个函数function_times = timeit.repeat(    stmt='another_slow_function()',    setup='from __main__ import another_slow_function',    number=1,    repeat=5)print(f"函数 another_slow_function 执行时间: {min(function_times):.6f} 秒 (最短时间)")

更棒的是,

timeit

可以直接通过命令行调用,这完美符合“Python命令”的需求:

# 在命令行中直接运行,测试一段代码python -m timeit "'-'.join(str(n) for n in range(100))"# 测试一段更长的代码,可以写成多行python -m timeit -s "import math" "math.sqrt(2)"# 测试一个函数(需要确保函数在当前环境中可用,或在setup中导入)# 假设你的脚本叫 my_script.py 里面有 my_slow_function# python -m timeit -s "from my_script import my_slow_function" "my_slow_function()"

通过命令行使用

timeit

非常方便,特别是当你只想快速测试某个表达式或一行代码的性能时。

为什么精确统计脚本执行时间如此重要?

说实话,刚开始写代码的时候,我可能没那么在意执行时间。但随着项目复杂度提升,你会发现,那些看似微不足道的毫秒,累积起来就是实实在在的用户等待,或者是服务器上不必要的资源消耗。精确计时,首先是帮你找到代码里的“慢动作”,那些拖后腿的瓶颈。比如你写了一个数据处理脚本,跑了半天没结果,这时候不计时,你怎么知道是算法问题还是IO阻塞?其次,它还是个衡量不同方案优劣的尺子。同一功能,A方案跑了10秒,B方案只用了1秒,高下立判。这不仅关乎用户体验,也直接影响服务器资源消耗和运营成本。所以,这不仅仅是技术细节,更是效率和成本的考量。它能帮助我们做出数据驱动的优化决策,而不是凭感觉猜测。

计时时需要避开的常见误区及注意事项

计时这事儿,看起来简单,但要做到精确且有意义,里头门道还真不少。我踩过不少坑,也总结了一些经验。

测量开销 (Measurement Overhead): 比如,你用

time.time()

包住一小段代码,这行代码本身可能就只执行了几微秒,但你调用

time.time()

的开销,以及打印、计算的开销,可能就比实际执行时间还长了。这就是所谓的“测量开销”。对于极短的代码片段,

timeit

模块之所以更推荐,就是因为它能更好地处理这种开销。系统环境影响 (System Environment): 别忘了你的电脑不是只运行你一个脚本。后台跑着浏览器、音乐播放器,这些都会抢占CPU时间,导致你的计时结果波动。所以,在进行关键性能测试时,尽量在一个干净、负载低的系统环境下运行。JIT/缓存效应 (JIT/Caching Effects): Python的解释器不像Java或C#那样有激进的JIT(Just-In-Time)编译器,但它有字节码缓存和其他内部优化。例如,模块第一次导入会慢一些,或者某些代码块在多次执行后可能会有轻微的加速。所以,跑一次就下结论,往往是不靠谱的。

timeit

模块通过多次重复执行来缓解这个问题。I/O 操作 (I/O Operations): 如果你的脚本涉及到大量文件读写、网络请求或数据库操作,那么大部分时间可能都花在等待I/O上了,而不是CPU计算。这时候,单纯的执行时间可能无法反映CPU密集型任务的效率。得具体问题具体分析,必要时需要使用更专业的工具来区分CPU时间和I/O等待时间。暖启动 (Warm-up): 首次运行脚本时,Python解释器可能需要加载模块、初始化数据结构等。这些“暖启动”的开销会使第一次执行时间偏长。因此,在进行性能比较时,通常会忽略第一次运行的结果,或者让代码先“热身”一下。

除了基础计时,Python还有哪些更专业的性能分析工具?

如果你的脚本执行时间确实很长,而且基础计时已经告诉你“这里有问题”,但具体是哪一行、哪个函数拖了后腿,这时候就需要更专业的工具了。

cProfile

/

profile

模块: Python标准库里就有

cProfile

(或其纯Python实现

profile

),它能帮你统计每个函数被调用了多少次,每次调用平均耗时多久,总耗时多少。这就像是给你的代码做了一次全面的“体检报告”,能清晰地告诉你哪个函数是“病灶”。你可以这样使用它:

import cProfileimport pstatsdef another_complex_function():    total = 0    for i in range(1000000):        total += i * i    return totaldef main_logic():    another_complex_function()    time.sleep(0.1) # 模拟一些I/O等待    list_comp = [x*x for x in range(500000)]    return list_compprofiler = cProfile.Profile()profiler.enable() # 开启性能分析main_logic() # 运行你的代码profiler.disable() # 关闭性能分析# 打印分析结果stats = pstats.Stats(profiler).sort_stats('cumulative') # 按累积时间排序stats.print_stats(10) # 打印前10行# stats.dump_stats('profile_results.prof') # 保存结果到文件
cProfile

的输出通常是纯文本的,看起来有点费劲。

snakeviz

(第三方工具): 这时候,

snakeviz

这类工具就派上用场了,它能把

cProfile

的输出可视化成火焰图或者调用图,让你一眼看出性能瓶颈在哪。安装后,你可以用

snakeviz profile_results.prof

命令在浏览器中打开可视化报告。

line_profiler

(第三方工具): 如果你想知道代码具体哪一行消耗了最多时间,可以试试第三方库

line_profiler

。它能提供行级别的性能报告,这对于精确定位问题非常有帮助。你需要用

pip install line_profiler

安装,然后通过特定的装饰器或命令行工具来运行。

memory_profiler

(第三方工具): 如果问题是内存占用过高,而不是CPU时间,那

memory_profiler

会是你的好帮手。它能帮助你分析代码的内存使用情况,找出内存泄漏或不必要的内存消耗。

这些工具虽然不像

time

模块那样随手可用,但它们提供的深度分析能力,是解决复杂性能问题的关键。它们能让你从“大概知道慢”升级到“精确知道哪里慢,为什么慢”,从而进行有针对性的优化。

以上就是Python命令怎样统计脚本的执行时间 Python命令计时功能的基础教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1366911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python函数怎样用闭包实现简单的计数器 Python函数闭包计数器功能的编写教程​
上一篇 2025年12月14日 06:58:06
Python屏蔽输出信息怎样在使用爬虫时隐藏请求日志 Python屏蔽输出信息的爬虫日志管控教程​
下一篇 2025年12月14日 06:58:21

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    000
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    100
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    000
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    000
  • Debian syslog性能优化技巧有哪些

    提升Debian系统syslog (通常基于rsyslog)性能,关键在于精简配置和高效处理日志。以下策略能有效优化日志管理,提升系统整体性能: 精简配置,高效加载: 在rsyslog配置文件中,仅加载必要的输入、输出和解析模块。 使用全局指令设置日志级别和格式,避免不必要的处理。 自定义模板: 创…

    2026年5月10日
    000
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • vscode上怎么运行html_vscode上运行html步骤【指南】

    首先保存文件为.html格式,再通过浏览器或Live Server插件打开预览;推荐安装Live Server实现本地服务器运行与实时刷新,提升开发体验。 在 VS Code 上运行 HTML 文件并不需要复杂的配置,只需几个简单步骤即可预览页面效果。VS Code 本身是一个代码编辑器,不直接运行…

    2026年5月10日
    100
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 《魔兽世界》将于6月11日开启国服回归技术测试

    《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试

    《%ign%ignore_a_1%re_a_1%》官方宣布,将于6月11日开启国服回归技术测试,时间为7天,并称可以在6月内正式开服,玩家们可以访问官网下载战网客户端并预下载“巫妖王之怒”客户端,技术测试详情见下图。 WordAi WordAI是一个AI驱动的内容重写平台 53 查看详情 以上就是《…

    2026年5月10日 用户投稿
    200
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    000
  • 前端缓存策略与JavaScript存储管理

    根据数据特性选择合适的存储方式并制定清晰的读写与清理逻辑,能显著提升前端性能;合理运用Cookie、localStorage、sessionStorage、IndexedDB及Cache API,结合缓存策略与定期清理机制,可在保证用户体验的同时避免安全与性能隐患。 前端缓存和JavaScript存…

    2026年5月10日
    100
  • 网站标题关键词更新后,搜索引擎为何仍显示旧标题?

    网站标题更新后,搜索引擎为何显示旧标题? 网站SEO优化中,站长常修改网站标题关键词,期望搜索结果显示自定义标题。然而,即使更新标签、meta keywords、meta description和结构化数据中的name属性后,搜索结果仍显示旧标题,这令人费解。本文将对此进行解释。 问题:站长修改了网…

    2026年5月10日
    100
  • c#文件怎么打开

    打开 C# 文件有三种方法:Visual Studio:启动 Visual Studio,通过“文件”菜单打开 C# 文件。文本编辑器:使用文本编辑器打开 C# 文件,将其视为普通文本。.NET Core 命令行工具:使用 csc.exe 命令行工具编译 C# 文件,生成可执行文件。 如何打开 C#…

    2026年5月10日
    000
  • HTML5网页如何实现手势操作 HTML5网页移动端交互的处理技巧

    首先利用原生touch事件实现滑动判断,再通过preventDefault解决滚动冲突,接着引入Hammer.js处理复杂手势,最后通过优化点击区域、避免事件冲突和增加视觉反馈提升体验。 在移动端浏览器中,HTML5网页可以通过触摸事件实现手势操作,提升用户体验。虽然原生JavaScript提供了基…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信