监控Python内存使用情况和代码执行时间
我的代码的哪些部分运行时间最长、内存最多? 我怎样才能找到需要改进的地方?"
在开发过程中,我很确定我们大多数人都会想知道这一点,而且通常情况下存在开发空间。 在本文中总结了一些方法来监控 Python 代码的时间和内存使用情况。
本文将介绍4种方法,前3种方法提供时间信息,第4个方法可以获得内存使用情况。time 模块%%time 魔法命令line_profilermemory_profilertime 模块
这是计算代码运行所需时间的最简单、最直接(但需要手动开发)的方法。他的逻辑也很简单:记录代码运行之前和之后的时间,计算时间之间的差异。这可以实现如下:
import time
start_time = time.time()
result = 5+2
end_time = time.time()
print("Time taken = {} sec".format(end_time - start_time))
下面的例子显示了for循环和列表推导式在时间上的差异:import time # for loop vs. list comp list_comp_start_time = time.time() result = [i for i in range(0,1000000)] list_comp_end_time = time.time() print("Time taken for list comp = {} sec".format(list_comp_end_time - list_comp_start_time)) result=[] for_loop_start_time = time.time() for i in range(0,1000000): result.append(i) for_loop_end_time = time.time() print("Time taken for for-loop = {} sec".format(for_loop_end_time - for_loop_start_time)) list_comp_time = list_comp_end_time - list_comp_start_time for_loop_time = for_loop_end_time - for_loop_start_time print("Difference = {} %".format((for_loop_time - list_comp_time)/list_comp_time * 100))
我们都知道for会慢一些Time taken for list comp = 0.05843973159790039 sec Time taken for for-loop = 0.06774497032165527 sec Difference = 15.922795107582594 %%%time 魔法命令
魔法命令是IPython内核中内置的方便命令,可以方便地执行特定的任务。一般情况下都实在jupyter notebook种使用。
在单元格的开头添加%%time ,单元格执行完成后,会输出单元格执行所花费的时间。%%time def convert_cms(cm, unit="m"): """ Function to convert cm to m or feet """ if unit == "m": return cm/100 return cm/30.48 convert_cms(1000)
结果如下:CPU times: user 24 µs, sys: 1 µs, total: 25 µs Wall time: 28.1 µs Out[8]: 10.0
这里的CPU times是CPU处理代码所花费的实际时间,Wall time是事件经过的真实时间,在方法入口和方法出口之间的时间。line_profiler
前两个方法只提供执行该方法所需的总时间。通过时间分析器我们可以获得函数中每一个代码的运行时间。
这里我们需要使用line_profiler包。使用pip install line_profiler。import line_profiler def convert_cms(cm, unit="m"): """ Function to convert cm to m or feet """ if unit == "m": return cm/100 return cm/30.48 # Load the profiler %load_ext line_profiler # Use the profiler"s magic to call the method %lprun -f convert_cms convert_cms(1000, "f")
输出结果如下:Timer unit: 1e-06 s Total time: 4e-06 s File: /var/folders/y_/ff7_m0c146ddrr_mctd4vpkh0000gn/T/ipykernel_22452/382784489.py Function: convert_cms at line 1 Line # Hits Time Per Hit % Time Line Contents ============================================================== 1 def convert_cms(cm, unit="m"): 2 """ 3 Function to convert cm to m or feet 4 """ 5 1 2.0 2.0 50.0 if unit == "m": 6 return cm/100 7 1 2.0 2.0 50.0 return cm/30.48
可以看到line_profiler提供了每行代码所花费时间的详细信息。Line Contents :运行的代码Hits:行被执行的次数Time:所花费的总时间(即命中次数x每次命中次数)Per Hit:一次执行花费的时间,也就是说 Time = Hits X Per Hit% Time:占总时间的比例
可以看到,每一行代码都详细的分析了时间,这对于我们分析时间相当的有帮助。memory_profiler
与line_profiler类似,memory_profiler提供代码的逐行内存使用情况。
要安装它需要使用pip install memory_profiler。我们这里监视convert_cms_f函数的内存使用情况from conversions import convert_cms_f import memory_profiler %load_ext memory_profiler %mprun -f convert_cms_f convert_cms_f(1000, "f")
convert_cms_f函数在单独的文件中定义,然后导入。结果如下:Line # Mem usage Increment Occurrences Line Contents ============================================================= 1 63.7 MiB 63.7 MiB 1 def convert_cms_f(cm, unit="m"): 2 """ 3 Function to convert cm to m or feet 4 """ 5 63.7 MiB 0.0 MiB 1 if unit == "m": 6 return cm/100 7 63.7 MiB 0.0 MiB 1 return cm/30.48
memory_profiler 提供对每行代码内存使用情况的详细了解。
这里的1 MiB (MebiByte) 几乎等于 1MB。 1 MiB = 1.048576 1MB
但是memory_profiler 也有一些缺点:它通过查询操作系统内存,所以结果可能与 python 解释器略有不同,如果在会话中多次运行 %mprun,可能会注意到增量列报告所有代码行为 0.0 MiB。 这是因为魔法命令的限制导致的。
虽然memory_profiler有一些问题,但是它就使我们能够清楚地了解内存使用情况,对于开发来说是一个非常好用的工具总结
虽然Python并不是一个以执行效率见长的语言,但是在某些特殊情况下这些命令对我们还是非常有帮助的。
作者:Rishikeshavan
痛风乳腺癌肾功能不全,不能吃豆腐?大豆制品作为家常食材,便宜实惠,营养价值高。然后现在很多人不敢吃了。尿酸高不能吃大豆制品的,尤其是豆腐豆浆?多吃豆腐会患乳腺癌?肾病不能吃大豆制品?今天瑞金医院临床营养科医生一口气
青葱岁月杨国栋瑛子,你是否记还得当年那份青涩的萌动?周末,我们几个户县八中毕业的同学相聚时,谈起青春岁月里共同的高中时代。受大家启发与抬举,以大家的故事为故事,以大家的推理为推理,或实或虚,或有或无,总之形成了以下清涩的文字,权当一
精彩青岛我来了!在青台湾青年携台湾网络达人采风行精彩启程青岛新闻网12月13日讯(记者宋波鸿)12月13日上午,在青岛台湾青年携台湾网络达人采风行活动在青岛中心假日酒店正式启程。台湾网络达人媒体记者以及在青岛的台湾青年汇聚一堂,将在未来
专家解趋势猪肉消费已经进入稳定平台期原标题猪肉消费已经进入稳定平台期作者雷少斐猪肉消费的变化,不仅有短期因素的作用,还受到肉类消费结构调整的长期趋势影响。近日,记者采访了相关专家,以揭示我国猪肉消费形势及未来趋势。回
生命论048娃娃是自己的乖吗人世间很多悲剧本是可以避免的。知道了,算学问!做到了,叫成功!逢周四发文,与你共探生命的奥秘。作者胡成志通过前几期的讨论,我们认识到所有生命体都具有善与恶的两重性,善主要用于繁衍,
荒唐!护士将导尿管插入阴道疑致孕妇流产?做试管花了十五六万导语疑似又是一起医疗事故,究竟是什么样的护士,才会将导尿管插到孕妇的阴道里?诡异的是,医院承认失误,但否认孕妇流产是插错管造成的。真相到底是什么?作者树欲静smile图片网络(侵删
你不曾了解过的邓丽君如今提及邓丽君,脑海里依然浮现出甜蜜蜜月亮代表我的心但愿人长久等脍炙人口的歌曲。在42年的短暂生命里,邓丽君一共发行了185张专辑,唱过3000余首歌曲。听过她歌声的人,只要再次听
朋友圈停更,事出有因在头条看见彼此曾几何时,随着风靡一时的QQ逐渐落幕,一款全新的微信社交软件走进了人们的生活。2013年中秋节前夕,首次下载了微信,发的第一个朋友圈图片是那年十五的月亮,配文中秋快乐
身材不应该限制美丽!被喊大码女孩的她们,活出了自己最喜欢的样子晚上好呀。之前每次写穿搭都有人说还是要瘦只有瘦了才能这样穿,其实我一直觉得,不管是什么身材,都可以穿出属于自己的美。这次就请来了两位达人来分享,她们不受身材限制,自信地穿出了自己的
极度严寒下,60余款新能源车综合大比拼,表现好的车都在这里对于新能源车来说,在气温比较低的环境下使用,是极为不友好的。除了续航里程会大打折扣,在充电管理空调制热以及车辆稳定性等各个方面,都是一个比较大的考验。所以,为了能够提升车辆的可靠性
精准分类W地物快速分类方法研究精准分类基于大禹SpecvisionW地物快速分类方法研究引言遥感已经成为了解地球表面变化的非常有用的数据来源。基于遥感来观测光谱特征的土地利用分类技术已被广泛应用于许多环境监测土
风中的泪文邪恶龙骑士风,轻轻的吹过,我的眼止不住流下那悔恨的眼泪。雨,悄悄的落下,我站在路边的一角,回味那片刻的忧伤。此时此刻,风吹落我眼中的泪。那眼泪,晶莹剔透。跟雨水混合在一起,犹如一
河北省沧州市沧县纪晓岚墓,不贪财不近女色为何有七位女性陪葬纪晓岚墓位于沧县崔尔庄镇北村村,纪晓岚身为清朝有名的才子,又是乾隆皇帝身边的大红人,想必墓园规模不小,规格也不会太寒酸。据传纪晓岚死后为了防止盗墓,从京城到家乡每隔50公里就修一座
黄欢冬山区学校那些糗事儿那天,我们十几个久别重逢的同学由平江去浏阳旅游,一路上无话不说,谈我们的校园,虽然离校数十年,老师让我们难忘,同学让我们难忘,当然,当年我们那些年的糗事儿也难忘那年代,读书发蒙年龄
是谁容不下38妇女节,妇女二字的真意女性也不懂,谁还来关爱你?在没有进入3月之前,网上的各种营销就开始了,什么3。7女生节,3。8女神节,什么女王节。洗脑到大家是不是都忘记了,3月8日这个节日叫三八国际劳动妇女节。中国大部分女性已经被资本捧杀
树倒猢狲散!齐麟欲联手曾凡博统治CBA,阿不都携旧友续前缘新疆男篮的退出对于CBA无疑是巨大损失,毕竟影响的不仅是联赛而是整个中国篮坛!同时球队宣布退出之后,球员的去向何去何从?俨然已成为如今急需解决的事情。据悉广汇已经将球队全权交给当地
76人为留哈登使出杀手锏,六换四报价绿军二当家,组三巨头阵容76人队在今年夏天有一个很大的问题需要解决,那就是如何留下球队核心之一的詹姆斯哈登。在最近有多家美国媒体爆料,如果76人队不能在今年夏天拿下总冠军,那么哈登将会以自由球员的身份离队
西甲综合马竞61大胜塞维利亚20222023赛季西班牙足球甲级联赛第24轮4日展开四场较量。马德里竞技在主场61狂胜塞维利亚,跻身联赛积分榜前三。马竞在上半时第23分钟首开记录,德佩单刀突至塞维利亚禁区边缘推
英超0曼联造双红会最大比分萨拉赫2球加冕队史射手王北京时间3月6日凌晨0点30分,202223赛季英超联赛第26轮迎来本赛季第二回合的双红会,利物浦坐镇安菲尔德球场迎战曼联。比赛中,利物浦火力全开,加克波努涅斯双双梅开二度,菲尔米
西甲0瓦伦西亚领跑北京时间3月5日晚23点15分,202223赛季西甲联赛第24轮,领头羊巴塞罗那坐镇主场诺坎普球场迎战瓦伦西亚。上半场,拉菲尼亚头球破门下半场,费兰托雷斯主罚点球不进,法蒂击中了立
莫兰特被处罚太轻,重的还在后头3月4日,莫兰特在一家夜店玩乐直播,这本是一件稀松平常的小事。可是,让事情大条的是他居然在直播中露出了一把手枪。大家知道,美国每年死于枪支泛滥的人数多达几万人。很多人都是被无辜的牵
邮报救助灾区,C罗已派满载物资的专机飞往土耳其和叙利亚据每日邮报的报道,为了援助土耳其以及叙利亚等灾区的人民,利雅得胜利球星C罗已经派了一辆专机往地震灾区运送了一批救灾物资。C罗已经派出一架满载援助物资的飞机前往受灾地区,因为他希望帮