Python中测量经过时间的方法
off999 2025-04-27 15:33 58 浏览 0 评论
技术背景
在Python开发中,我们经常需要测量一段代码或一个函数的执行时间,以此来评估代码的性能、优化算法或者比较不同实现方式的效率。Python提供了多种方法来实现时间测量,每种方法都有其特点和适用场景。
实现步骤
1. 使用time.time()
time.time()返回当前时间的时间戳(从纪元开始的秒数),可以通过记录开始和结束的时间戳来计算经过的时间。
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)这种方法简单直接,能得到代码执行的大致时间,但它受系统时间调整的影响,如NTP时间同步、手动调整系统时间等。
2. 使用timeit.default_timer
timeit.default_timer会根据不同的操作系统和Python版本自动选择最佳的时钟,在Python 3.3+中,它被赋值为time.perf_counter()。
from timeit import default_timer as timer
start = timer()
# ...
end = timer()
print(end - start)这种方法相对准确,能避免一些系统时间调整带来的问题。
3. 使用time.perf_counter()和time.process_time()(Python 3)
- time.perf_counter():用于系统范围的计时,返回性能计数器的值,包括睡眠时间,具有较高的精度。
import time
t = time.perf_counter()
# do some stuff
elapsed_time = time.perf_counter() - t- time.process_time():用于进程范围的计时,不包括睡眠时间,只统计CPU的执行时间。
import time
t = time.process_time()
# do some stuff
elapsed_time = time.process_time() - t4. 使用timeit模块
timeit模块可以更精确地测量代码的执行时间,它会多次执行代码并计算平均时间。
import timeit
def foo():
return 1 + 1
time = timeit.timeit(foo, number=1000)
print(time)从命令行使用timeit:
python -mtimeit -s'import test' 'test.foo()'5. 使用上下文管理器
可以自定义上下文管理器来方便地测量代码块的执行时间。
from contextlib import contextmanager
from timeit import default_timer
@contextmanager
def elapsed_timer():
start = default_timer()
elapser = lambda: default_timer() - start
yield lambda: elapser()
end = default_timer()
elapser = lambda: end - start
import time
with elapsed_timer() as elapsed:
time.sleep(1)
print(elapsed())
time.sleep(2)
print(elapsed())
time.sleep(3)6. 使用装饰器
可以定义装饰器来测量函数的执行时间。
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start = time.perf_counter()
original_return_val = func(*args, **kwargs)
end = time.perf_counter()
print("time elapsed in ", func.__name__, ": ", end - start, sep='')
return original_return_val
return wrapper
@timing_decorator
def function_to_time():
time.sleep(1)
function_to_time()核心代码示例
使用time.perf_counter()测量函数执行时间
import time
def my_function():
for i in range(1000000):
pass
start = time.perf_counter()
my_function()
end = time.perf_counter()
print(f"函数执行时间: {end - start} 秒")使用timeit模块测量代码块执行时间
import timeit
code = """
for i in range(1000):
pass
"""
execution_time = timeit.timeit(code, number=1000)
print(f"代码块执行时间: {execution_time} 秒")最佳实践
- 选择合适的方法:根据具体需求选择合适的时间测量方法。如果只需要大致的执行时间,可以使用time.time();如果需要更精确的测量,建议使用timeit模块或time.perf_counter()。
- 多次测量取平均值:为了得到更准确的结果,可以多次执行代码并计算平均时间。timeit模块会自动进行多次执行并计算平均值。
- 避免干扰因素:在测量时间时,尽量避免其他程序的干扰,确保测量环境稳定。
常见问题
1. 测量结果不准确
- 原因:系统时间调整、其他程序的干扰、垃圾回收等因素都可能影响测量结果。
- 解决方法:使用timeit模块,它会自动处理垃圾回收等问题,并多次执行代码取平均值;选择合适的时钟函数,如time.perf_counter(),它受系统时间调整的影响较小。
2. timeit使用复杂
- 原因:timeit需要设置代码和执行次数,对于复杂的代码可能需要额外的设置。
- 解决方法:可以将代码封装成函数,然后使用timeit测量函数的执行时间;也可以从命令行使用timeit,避免在代码中进行复杂的设置。
3. 测量结果包含睡眠时间
- 原因:某些时钟函数(如time.perf_counter())会包含睡眠时间。
- 解决方法:如果不需要包含睡眠时间,可以使用time.process_time()来测量CPU的执行时间。
相关推荐
- 纯净无毒的win7下载(有没有纯净的win7系统)
-
下面提供的是微软发布的Windows7各版本光盘ISO镜像下载地址,原始文件均来源自MSDN,和零-售彩盒版本光盘内容完全一致。请放心下载。(如果需要光盘的买家,请无视以下内容)下...
- ie浏览器文件损坏怎么修复(ie浏览器破坏怎么恢复)
-
可以在浏览记录里面查到。重新下载一次就行了如果你在IE浏览器里面下载的文件被你不小心删掉了,而且这个文件对你来说很重要,你可以打开你的IE浏览器选择历史记录,在历史记录里面就可以找到相关的下载的地方,...
- 电脑没音量是什么原因(电脑没音量是什么原因造成的)
-
电脑突然没有声音可能是由于以下原因:1.音量设置被关闭或静音;2.音频驱动程序出现问题或需要更新;3.音频设备连接问题,例如音频插头没有插好或者有问题;4.操作系统的声音设置出现问题。解决方法包括检查...
- 电脑蓝屏u盘装系统教程(电脑蓝屏系统u盘怎么装系统)
-
dell电脑蓝屏用U盘重装系统方法,1在需要重装的电脑上插入启动U盘,开机并不断按下U盘启动快捷键。2在进入系统启动菜单中选择带有USB字样的选项并回车。3进入系统引导选项界面,选择Windows1...
- 系统之家官网纯净版(系统之家首页)
-
我现在用的就是系统之家的win7,以前用的是系统之家纯净版的xp,纯净版的好处就是没有预装的软件,缺点就是有些东西要自己装,包括有些软件必须的东西。装个游戏又要装这个又要装那个的很麻烦,我现在都是安装...
- 声卡正常但是麦克风没有声音
-
1、检查声卡、连接线,以及音箱等设备是否连接正常;运行杀毒软件进行杀毒;2、右击“我的电脑”----“属性”---“硬件”----“设备管理器”,打开“声音、视频和游戏控制器”有无问题,即看前面有没有...
- coreldraw教程自学(coreldraw零基础教学视频)
-
1、CDR是矢量软件,国内印刷业和部分设计用的较多;2、基础入门操作:A、看你用在具体的哪个细分行业,如印刷排版方面、户外室内喷绘方面、图形设计方面、字体设计等等……输出的要求不一样,其他基本一样...
- cad2010序列号和密钥激活码免费
-
回答如下:不可以,CAD2010序列号和密钥是两个不同的概念。序列号是一个唯一的标识符,用于识别软件产品的副本。而密钥是一个加密字符串,用于验证软件副本的合法性。在安装CAD2010时,需要输入正确的...
- 笔记本电脑联想好还是惠普好
-
惠普和联想为全球名列前茅的电脑品牌,其中惠普为美国品牌,联想为中国品牌。联想作为一个后起之秀,当年通过收购thankpad品牌,走向全球。电脑中又分出多种风格的子品牌,有的注重游戏性能,有的注重轻薄商...
- 如何安装路由器步骤(安装路由器操作步骤)
-
路由器安装设置共分两个步骤,依次是”路由器与光猫“串联,“宽带账号写入路由器”即可,方法如下:?步骤一首先将路由器与光猫串联,用网线一端连接至“光猫”的LAN端口,另一端连接至“路由器”的WAN端口“...
- 86位系统是不是32位(86位和32位)
-
众所周知,同众多主打影音娱乐的系统不同,Windows从工业生产到金融消费、从个人应用到企业环境,应用领域极其广泛。以工业生产为例,嵌入式设备只需满足生产中特定的任务,并不追求过剩性能,故而现有绝大多...
- msdn官网下载系统u盘(msdn下载后要怎么做u盘启动盘)
-
1.打开MSDN网站并搜索您需要下载的系统。2.找到并单击“下载”按钮。3.如果系统有多个版本,请选择您需要的版本。4.选择“保存到磁盘”并单击“确定”按钮。5.将U盘插入计算机,并打开文件...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
使用 python-fire 快速构建 CLI_如何搭建python项目架构
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
