当前位置:首页 > 科技  > 软件

你写的Python代码到底多快?这些测试工具了解了解

来源: 责编: 时间:2023-11-02 17:12:30 407观看
导读当我们写完一个脚本或一个函数,首先能保证得到正确结果,其次尽可能的快(虽然会说Py这玩意咋整都慢,但有的项目就是得要基于Py开发)。本期将总结几种获取程序运行时间的方法,极大的帮助对比不同算法/写法效率。使用系统命令

当我们写完一个脚本或一个函数,首先能保证得到正确结果,其次尽可能的快(虽然会说Py这玩意咋整都慢,但有的项目就是得要基于Py开发)。NEr28资讯网——每日最新资讯28at.com

本期将总结几种获取程序运行时间的方法,极大的帮助对比不同算法/写法效率。NEr28资讯网——每日最新资讯28at.com

NEr28资讯网——每日最新资讯28at.com

使用系统命令

每个操作系统都有自己的方法来算程序运行的时间,比如在Windows PowerShell中,可以用 Measure-Command 来看一个Python文件的运行时间:NEr28资讯网——每日最新资讯28at.com

Measure-Command {python tutorial.py}

NEr28资讯网——每日最新资讯28at.com

在Ubuntu中,使用time命令:NEr28资讯网——每日最新资讯28at.com

time python tutorial.py

如果我们除了看整个 Python 脚本的运行时间外还想看看局部运行时间咋整NEr28资讯网——每日最新资讯28at.com

使用 IPython 的 Magic Command

如果你使用过如Jupyter Notebook等工具会知道,他们用到了一个叫做 IPython 的交互式 Python 环境。NEr28资讯网——每日最新资讯28at.com

在 IPython 中,有一个特别方便的命令叫做 timeit。NEr28资讯网——每日最新资讯28at.com

对于某行代码的测量可以使用%timeit:NEr28资讯网——每日最新资讯28at.com

NEr28资讯网——每日最新资讯28at.com

对于某一个代码单元格的测量,可以使用%%timeit:NEr28资讯网——每日最新资讯28at.com

NEr28资讯网——每日最新资讯28at.com

使用timeit

如果不用IPython咋整,没关系,已经很厉害了,Python 有一个内置的timeit模块,可以帮助检测小段代码运行时间NEr28资讯网——每日最新资讯28at.com

可以在命令行界面运行如下命令:NEr28资讯网——每日最新资讯28at.com

python -m timeit '[i for i in range(100)]'

使用 timeit 测量执行此列表推导式所需的时间,得到输出:NEr28资讯网——每日最新资讯28at.com

200000 loops, best of 5: 1.4 usec per loop

此输出表明每次计时将执行200000次列表推导,共计时测试了5次,最好的结果是1.4毫秒。NEr28资讯网——每日最新资讯28at.com

或者直接在Python中调用:NEr28资讯网——每日最新资讯28at.com

import timeitprint(timeit.timeit('[i for i in range(100)]', number=1))

对于更复杂的情况,有三个参数需要考虑:NEr28资讯网——每日最新资讯28at.com

  • stmt:待测量的代码片段,默认是 pass
  • setup:在运行 stmt 之前执行一些准备工作,默认也是 pass
  • number:要运行 stmt 的次数

比如一个更复杂的例子:NEr28资讯网——每日最新资讯28at.com

import timeit# prerequisites before running the stmtmy_setup = "from math import sqrt"# code snippet we would like to measuremy_code = '''def my_function():    for x in range(10000000):        sqrt(x)'''print(timeit.timeit(setup=my_setup,                    stmt=my_code,                    number=1000))# 6.260000000000293e-05

使用time模块

Python中内置的time模块相信都不陌生,基本的用法是在待测代码段的起始与末尾分别打上时间戳,然后获得时间差:NEr28资讯网——每日最新资讯28at.com

import timedef my_function():    for i in range(10000000):        passstart = time.perf_counter()my_function()print(time.perf_counter()-start)# 0.1179838

我经常使用time.perf_counter()来获取时间,更精确,在之前的教程中有提过。NEr28资讯网——每日最新资讯28at.com

time模块中还有一些其他计时选择:NEr28资讯网——每日最新资讯28at.com

  • time.timer():获取当前时间
  • time.perf_counter():计算程序的执行时间(高分辨率)
  • time.monotonic():计算程序的执行时间(低分辨率)
  • time.process_time():计算某个进程的CPU时间
  • time.thread_time():计算线程的CPU时间

假如我们需要在多个代码段测试运行时间,每个首尾都打上时间戳再计算时间差就有点繁琐了,咋整,上装饰器:NEr28资讯网——每日最新资讯28at.com

import timedef log_execution_time(func):    def wrapper(*args, **kwargs):        start = time.perf_counter()        res = func(*args, **kwargs)        end = time.perf_counter()        print(f'The execution of {func.__name__} used {end - start} seconds.')        return res    return wrapper@log_execution_timedef my_function():    for i in range(10000000):        passmy_function()# The execution of my_function used 0.1156899 seconds.

如上例所示,这样就使得代码肥肠干净与整洁。NEr28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16609-0.html你写的Python代码到底多快?这些测试工具了解了解

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: React性能优化之useMemo、useCallback

下一篇: 增强现实可穿戴设备如何提高医疗保健效率

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top