Python中计时程序运行时间的几种常用方法

 更新时间:2025年04月18日 10:16:39   作者:NameError_sfj  
这篇文章主要介绍了Python中计时程序运行时间的几种常用方法,分别是一般方法、基于上下文管理器和基于装饰器,每种方法都有其适用场景和优缺点,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在实际工作中,我们常常需要知道程序的实际运行时间(wall-clock time, real time)。本文就介绍了几种在Python中计时程序运行耗时的方法。

1. 一般方法

最为常见的方法,就是在代码的开头和结尾分别获取时间戳,然后两者之差便是程序运行时间。

import time

def do_something(nsec=0):
	if isinstance(nsec, (int, float)):
		time.sleep(nsec)  # 模拟程序运行耗时

if __name__ == "__main__":
	start_time	= time.perf_counter()  # 记录开始时间戳
	do_something(3)
	do_something(1)
	do_something(0.5)
	end_time = time.perf_counter()  # 记录结束时间戳
	print(f"耗时 {end_time - start_time:.3f} s")

这是最简单直接的方法,但问题是当需要计时的部分很多的时候,会导致大量的重复代码。

2. 基于上下文管理器

相比之下,使用Python的上下文管理器(context manager)是更加优雅,复用性更好的解决方案。Python的上下文管理器机制是用来更加方便地管理如文件、数据库连接、锁等资源的,确保在使用结束后恰当地关闭及释放资源,以避免造成泄露。
然而,上下文管理器的用途不仅限于资源的管理,其适合于所有的代码开始和结束的成对操作,就比如计时程序的运行时间。

import time 

class Timer:
	"""
	按照 xxh xxm xxs格式计时程序运行时间的计时上下文管理器
	"""
	def __init__(self, code_part):
		self._part = code_part
		
	def __enter__(self):
		self._enter_time = time.perf_counter()
		
	def __exit__(self, *exc_args):  # 不做异常处理,因此将异常相关的参数打包
		time_span = time.perf_counter() - self._enter_time
		hours, seconds = divmod(time_span, 3600)
		minutes, seconds = divmod(seconds, 60) 
		print(f"{self._part}耗时 {int(hours)}h {int(minutes)}m {seconds:.2f}s")

def do_something(nsec=0):
	if isinstance(nsec, (int, float)):
		time.sleep(nsec)  # 模拟程序运行耗时

if __name__ == "__main__":
	with Timer("Main"):
		with Timer("Part1"):
			do_something(0.3)
		with Timer("Part2"), open("demo_file.txt", "wt") as f:
			f.write("Hello, World\n")
			do_something(2)
		do_something(1)

3. 基于装饰器

使用Python的装饰器特性,可以十分方便地在函数水平添加计时器,计时单个函数的运行时间。

import time
from functools import wraps

def timer(func):
	@wraps(func)
	def inner(*args, **kwargs):
		start_time = time.perf_counter()
		retval = func(*args, **kwargs)
		time_span = time.perf_counter() - start_time
		hours, seconds = divmod(time_span, 3600)
		minutes, seconds = divmod(seconds, 60) 
		print(f"{func.__name__}耗时 {int(hours)}h {int(minutes)}m {seconds:.2f}s")
		return retval
	return inner

@timer
def do_something(nsec=0):
	if isinstance(nsec, (int, float)):
		time.sleep(nsec)  # 模拟程序运行耗时

@timer
def main():
	do_something(1)
	time.sleep(0.5)

if __name__ == "__main__":
	main()	

总结 

到此这篇关于Python中计时程序运行时间的几种常用方法的文章就介绍到这了,更多相关Python计时程序运行时间方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何利用itertuples对DataFrame进行遍历

    如何利用itertuples对DataFrame进行遍历

    这篇文章主要介绍了如何利用itertuples对DataFrame进行遍历问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • PyCharm运行Python代码时出现"未找到模块"错误解决步骤

    PyCharm运行Python代码时出现"未找到模块"错误解决步骤

    在使用python的过程中经常会遇到一个问题,就是叫什么名字的模块未发现,下面这篇文章主要给大家介绍了关于PyCharm运行Python代码时出现"未找到模块"错误的解决步骤,需要的朋友可以参考下
    2023-11-11
  • python pip安装的包放在哪个目录(site-packages目录的位置)

    python pip安装的包放在哪个目录(site-packages目录的位置)

    这篇文章主要介绍了python pip安装的包放在哪个目录(site-packages目录的位置),通常安装在python安装目录下的lib/site-packages目录下,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • python笔记:mysql、redis操作方法

    python笔记:mysql、redis操作方法

    下面小编就为大家带来一篇python笔记:mysql、redis操作方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 关于Python调用百度语音合成SDK实现文字转音频的方法

    关于Python调用百度语音合成SDK实现文字转音频的方法

    这篇文章主要介绍了关于Python调用百度语音合成SDK实现文字转音频的方法,AipSpeech是语音合成的Python SDK客户端,为使用语音合成的开发人员提供了一系列的交互方法,需要的朋友可以参考下
    2023-07-07
  • python requests证书问题解决

    python requests证书问题解决

    这篇文章主要介绍了python requests证书问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python学习Turtle库画对称勾股树体会分形惊艳

    Python学习Turtle库画对称勾股树体会分形惊艳

    这篇文章主要为大家介绍了Python学习中如何使用Turtle库画对称勾股树,从而体会到分形世界的惊艳,文中附含详细示例代码有需要的朋友可以借鉴参考下
    2021-09-09
  • django为Form生成的label标签添加class方式

    django为Form生成的label标签添加class方式

    这篇文章主要介绍了django为Form生成的label标签添加class方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python 多线程超详细到位总结

    Python 多线程超详细到位总结

    线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。线程的划分尺度小于进程,使多线程程序的并发性高。进程在执行过程中拥有独立内存单元,而多个线程共享内存,从而提升程序运行效率
    2021-11-11
  • anaconda的安装和配置环境及导入pycharm的方法

    anaconda的安装和配置环境及导入pycharm的方法

    这篇文章主要介绍了anaconda的安装和配置环境及导入pycharm的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论