0

0

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

星夢妙者

星夢妙者

发布时间:2025-08-11 16:18:03

|

944人浏览过

|

来源于php中文网

原创

使用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 time

def 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_time
print(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 = 0
for 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
非常方便,特别是当你只想快速测试某个表达式或一行代码的性能时。

InstantMind
InstantMind

AI思维导图生成器,支持30+文件格式一键转换,包括PDF、Word、视频等。

下载

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

说实话,刚开始写代码的时候,我可能没那么在意执行时间。但随着项目复杂度提升,你会发现,那些看似微不足道的毫秒,累积起来就是实实在在的用户等待,或者是服务器上不必要的资源消耗。精确计时,首先是帮你找到代码里的“慢动作”,那些拖后腿的瓶颈。比如你写了一个数据处理脚本,跑了半天没结果,这时候不计时,你怎么知道是算法问题还是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 cProfile
    import pstats
    
    def another_complex_function():
        total = 0
        for i in range(1000000):
            total += i * i
        return total
    
    def main_logic():
        another_complex_function()
        time.sleep(0.1) # 模拟一些I/O等待
        list_comp = [x*x for x in range(500000)]
        return list_comp
    
    profiler = 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
模块那样随手可用,但它们提供的深度分析能力,是解决复杂性能问题的关键。它们能让你从“大概知道慢”升级到“精确知道哪里慢,为什么慢”,从而进行有针对性的优化。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

339

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

414

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

761

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

349

2025.07.23

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

538

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

26

2026.01.06

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

407

2023.08.14

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

141

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号