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函数的性能相关推荐

  1. 测试JavaScript函数的性能

    在软件中,性能一直扮演着重要的角色.在Web应用中,性能变得更加重要,因为如果页面速度很慢的话,用户就会很容易转去访问我们的竞争对手的网站.作为专业的web开发人员,我们必须要考虑这个问题.有很多&q ...

  2. 使用timeit测试python语句执行的时间

    使用timeit库可以测试小段代码片段的执行时间,简单示例如下: 代码: #!/usr/bin/env python3 # -*- coding: utf-8 -*-import random imp ...

  3. python 使用异常函数_您如何测试Python函数引发异常?

    python 使用异常函数 This article elaborates on how to implement a test case for a function that raises an ...

  4. python3使用timeit库做函数性能时间测试

    # ++++++++++++++++++++++++++++++++++++++++++++++++++++++ # <read-code-notes: 2021/6/9/9:48> # ...

  5. python函数测试_Python测试函数的方法之一

    Python测试函数的方法之一 首先介绍简单的try......except尝试运行的放例如下面的图和代码来简单介绍下: 注释:提醒以下代码环境为2.7.x 请3.x以上的同学们老规矩print(把打 ...

  6. 算法与数据结构(part2)--Python内置类型性能分析

    学习笔记,仅供参考 文章目录 算法与数据结构--基于python Python内置类型性能分析 timeit模块 计时器类timeit.Timer 计时器类下的timeit.Timer.timeit方 ...

  7. 快速记忆python函数-让Python程序快速提升30%的技巧

    一直以来Python性能是遭人诟病的问题之一,抱怨执行慢,没法用.虽然再性能上语言的差异确实存在着明显差异,但是我认为一个非常流行的语言,运行的快慢不会成为阻扰人们使用的因素.如果是的话,可能是由于编 ...

  8. python函数五要素_Python安装及关键要素

    一.Python定义 shell编程: 控制语言:胶水语言 框架:web应用开发 二.Python性能优化工具 Psyco: python语言是一个扩展模块,可以即时对程序代码进行专业的算法优化,可以 ...

  9. 用 Mars Remote API 轻松分布式执行 Python 函数

    Mars 是一个并行和分布式 Python 框架,能轻松把单机大家耳熟能详的的 numpy.pandas.scikit-learn 等库,以及 Python 函数利用多核或者多机加速.这其中,并行和分 ...

最新文章

  1. 无索引的亿级数据该如何删除?
  2. Timus 1049 Brave Balloonists
  3. IDEA2016.2 注册码
  4. 投票选举 算法_区块链主流共识算法一文全通
  5. sessionattribute 被spring 扫描不到_Spring 系列之 Spring 常用注解总结(肝硬化的干货)...
  6. java textvaluechanged 全选删除不触发_具有TextChanged事件的AutoCompleteBox未正确选择
  7. 什么时候以及为什么基于树的模型可以超过神经网络模型?
  8. OpenCV---轮廓发现
  9. win10修改服务器IP,Win10系统更改本地连接ip地址的方法
  10. 典型相关分析相关资料
  11. Makefile 文件中的:obj-$(CONFIG_TEST) += test.o,这一类的是什么意思?
  12. T-POT蜜罐平台 20.06 搭建
  13. 家庭单台计算机连接宽带步骤,两台win7电脑共用一个宽带账号上网的设置方法...
  14. Nature Reviews Microbiology | 土壤微生物组与同一健康
  15. 和风天气开发平台使用
  16. Python学习,用python-webdriver实现自动填表
  17. 如何把图片缩小到30k?怎么压缩图片体积大小?
  18. 软件中级设计师 - 面向对象开发
  19. 求解幂集问题(蛮力法)
  20. 在ie8上js实现简单的combobox功能(支持拼音检索)

热门文章

  1. linux虚拟机网络设置(本机使用公司内网)
  2. [转]Asp.Net Core 简单的使用加密的Cookie保存用户状态
  3. iOS开发-NULL和nullptr和nil和Nil还有NSNull
  4. QT自定义控件(生成和使用)
  5. Android 监听Home键
  6. jQuery 仿淘宝 鼠标悬停显示大图效果
  7. 需求入门 - 获取需求方法:Nine Boxes
  8. 学java_北京Java培训班好吗?去哪儿学
  9. 自由自在公司解读休闲食品的五大发展趋势
  10. 【学习笔记】SAP 成本对象控制