使用timeit测试Python函数的性能
timeit是Python标准库内置的小工具,可以快速测试小段代码的性能。
认识timeit
timeit 函数:
timeit.timeit(stmt, setup,timer, number)
参数说明:
- stmt: statement的缩写,你要测试的代码或者语句,纯文本,默认值是 “pass”
- setup: 在运行stmt前的配置语句,纯文本,默认值也是 “pass”
- timer: 计时器,一般忽略这个参数
- number: stmt执行的次数,默认是1000000,一百万
repeat 函数:
timeit.repeat(stmt, setup, timer, repeat, number)
是timeit的repeat版,可以指定重复timeit的次数,默认是3次,然后返回一个数组。
举一个简单的例子来说明用法:
import timeit
print(timeit.timeit('output = 10*5')) # 0.014560436829924583
print(timeit.repeat('output = 10*5')) # [0.01492984383367002, 0.01342877489514649, 0.013638464966788888]
嗯,看上去没毛病,实际上谁也不会去测没有意义的加减乘除,我们需要测试自己的代码。
测试多行代码
测试多行代码可以用分号来连接语句。
print(timeit.timeit(stmt='a=10;b=10;sum=a+b'))
也可以用三引号来写stmt。
import timeit
import_module = "import random"
testcode = '''
def test(): return random.randint(10, 100)
'''
print(timeit.repeat(stmt=testcode, setup=import_module))
但是其实都挺扯的,自己的代码会那么简单?我们是模块化编程。
测试模块中的函数
如果你要测试的函数都在一个模块里,可以这样写timeit。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import timeit
import random
import arrow# 本地函数
def stupid1():return random.randint(1, 10)# 依赖其他函数
def stupid2():return stupid1()# 依赖其他包或者模块
def stupid3():return arrow.now()print(timeit.timeit('stupid1()', setup='from __main__ import stupid1'))
print(timeit.timeit('stupid2()', setup='from __main__ import stupid2'))
print(timeit.timeit('stupid3()', setup='from __main__ import stupid3', number=100))
写成上面这样的其实还是单行的模式。
借用default_timer
timeit自带的default_timer
可以借来用一下。
import timeit
import randomdef test(): return random.randint(10, 100)starttime = timeit.default_timer()
print("The start time is :",starttime)
test()
print("The time difference is :", timeit.default_timer() - starttime)
命令行的用法
timeit还支持命令行的调用方式,不过我觉得太累了,没必要去尝试。
C:\pythontest>python -m timeit -s 'text="hello world"'
20000000 loops, best of 5: 13.1 nsec per loop
分享一个案例
2月29那天,我想今年是闰年啊,计算闰年有几种算法啊?孔乙己说有3种:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def is_leap_year_0(year):if year % 4 == 0:if year % 100 == 0:if year % 400 == 0:return Trueelse:return Falseelse:return Trueelse:return Falsedef is_leap_year_1(year):return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)def is_leap_year_2(year):if year % 400 == 0:return Trueif year % 100 == 0:return Falseif year % 4 == 0:return Truereturn False
这三种方法那种最好啊?这个不能一概而论吧,因为要看你的参数是什么,比如1991年不是闰年,方法0和方法1直接就返回了,但方法2还需要走到最后一个if才知道不是闰年。再比如2020年,方法2直接就返回了,但是方法0和1需要走到最里层的if才得到结果。所以我们需要取样测试才公平,比如从1900年到2900年,每个函数都跑10000遍。
timeit就不太方便了,它接受的参数哪能那么复杂,我们需要包装一下。
def perf_test(method):years = range(1900, 2900)if method == 0:for y in years:is_leap_year_0(y)if method == 1:for y in years:is_leap_year_1(y)if method == 2:for y in years:is_leap_year_2(y)print(timeit('perf_test(0)', setup='from __main__ import perf_test', number=10000))
print(timeit('perf_test(1)', setup='from __main__ import perf_test', number=10000))
print(timeit('perf_test(2)', setup='from __main__ import perf_test', number=10000))
你们猜猜看哪个方法结果最好?你一定想不到。
1.6432780250906944
1.7527272370643914
0.0023122059646993876
使用timeit测试Python函数的性能相关推荐
- 测试JavaScript函数的性能
在软件中,性能一直扮演着重要的角色.在Web应用中,性能变得更加重要,因为如果页面速度很慢的话,用户就会很容易转去访问我们的竞争对手的网站.作为专业的web开发人员,我们必须要考虑这个问题.有很多&q ...
- 使用timeit测试python语句执行的时间
使用timeit库可以测试小段代码片段的执行时间,简单示例如下: 代码: #!/usr/bin/env python3 # -*- coding: utf-8 -*-import random imp ...
- python 使用异常函数_您如何测试Python函数引发异常?
python 使用异常函数 This article elaborates on how to implement a test case for a function that raises an ...
- python3使用timeit库做函数性能时间测试
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++ # <read-code-notes: 2021/6/9/9:48> # ...
- python函数测试_Python测试函数的方法之一
Python测试函数的方法之一 首先介绍简单的try......except尝试运行的放例如下面的图和代码来简单介绍下: 注释:提醒以下代码环境为2.7.x 请3.x以上的同学们老规矩print(把打 ...
- 算法与数据结构(part2)--Python内置类型性能分析
学习笔记,仅供参考 文章目录 算法与数据结构--基于python Python内置类型性能分析 timeit模块 计时器类timeit.Timer 计时器类下的timeit.Timer.timeit方 ...
- 快速记忆python函数-让Python程序快速提升30%的技巧
一直以来Python性能是遭人诟病的问题之一,抱怨执行慢,没法用.虽然再性能上语言的差异确实存在着明显差异,但是我认为一个非常流行的语言,运行的快慢不会成为阻扰人们使用的因素.如果是的话,可能是由于编 ...
- python函数五要素_Python安装及关键要素
一.Python定义 shell编程: 控制语言:胶水语言 框架:web应用开发 二.Python性能优化工具 Psyco: python语言是一个扩展模块,可以即时对程序代码进行专业的算法优化,可以 ...
- 用 Mars Remote API 轻松分布式执行 Python 函数
Mars 是一个并行和分布式 Python 框架,能轻松把单机大家耳熟能详的的 numpy.pandas.scikit-learn 等库,以及 Python 函数利用多核或者多机加速.这其中,并行和分 ...
最新文章
- 无索引的亿级数据该如何删除?
- Timus 1049 Brave Balloonists
- IDEA2016.2 注册码
- 投票选举 算法_区块链主流共识算法一文全通
- sessionattribute 被spring 扫描不到_Spring 系列之 Spring 常用注解总结(肝硬化的干货)...
- java textvaluechanged 全选删除不触发_具有TextChanged事件的AutoCompleteBox未正确选择
- 什么时候以及为什么基于树的模型可以超过神经网络模型?
- OpenCV---轮廓发现
- win10修改服务器IP,Win10系统更改本地连接ip地址的方法
- 典型相关分析相关资料
- Makefile 文件中的:obj-$(CONFIG_TEST) += test.o,这一类的是什么意思?
- T-POT蜜罐平台 20.06 搭建
- 家庭单台计算机连接宽带步骤,两台win7电脑共用一个宽带账号上网的设置方法...
- Nature Reviews Microbiology | 土壤微生物组与同一健康
- 和风天气开发平台使用
- Python学习,用python-webdriver实现自动填表
- 如何把图片缩小到30k?怎么压缩图片体积大小?
- 软件中级设计师 - 面向对象开发
- 求解幂集问题(蛮力法)
- 在ie8上js实现简单的combobox功能(支持拼音检索)