python之timeit模块

timeit模块:

  • timeit 模块定义了接受两个参数的 Timer 类。两个参数都是字符串。 第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。
  • 一旦有了 Timer 对象,最简单的事就是调用 timeit(),它接受一个参数为每个测试中调用被计时语句的次数,默认为一百万次;返回所耗费的秒数。
  • Timer 对象的另一个主要方法是 repeat(), 它接受两个可选参数。 第一个参数是重复整个测试的次数,第二个参数是每个测试中调用被计时语句的次数。 两个参数都是可选的,它们的默认值分别是 3 和1000000。 repeat() 方法返回以秒记录的每个测试循环的耗时列表。Python 有一个方便的 min 函数可以把输入的列表返回成最小值,如: min(t.repeat(3, 1000000))

  测试一个列表推导式与for循环的时间


1

2

3

4

5

6

7

8

9

10

11

12

13

import timeit

foooo = """

sum = []

for i in range(1000):

    sum.append(i)

"""

print(timeit.timeit(stmt="[i for i in range(1000)]", number=100000))

print(timeit.timeit(stmt=foooo, number=100000))

#res:

#3.2855970134734345

#8.19918414604134

  使用列表推导式要比正常使用list追加元素 通过10w次循环会快上近5秒左右,速度快上近三倍。

  timeit 模块抽象出了;两个可以直接使用的方法,包了一层可以让我们不用关心内部的实现,下面看一下模块里面的代码:


1

2

3

4

5

6

7

8

9

def timeit(stmt="pass", setup="pass", timer=default_timer,

           number=default_number):

    """Convenience function to create Timer object and call timeit method."""

    return Timer(stmt, setup, timer).timeit(number)

def repeat(stmt="pass", setup="pass", timer=default_timer,

           repeat=default_repeat, number=default_number):

    """Convenience function to create Timer object and call repeat method."""

    return Timer(stmt, setup, timer).repeat(repeat, number)

  可以看到这两个方法都是对Timer类包了一层这几个参数:

  stmt: 这个参数就是statement,可以把要进行计算时间的代码放在里面。他可以直接接受字符串的表达式,也可以接受单个变量,也可以接受函数。

  setup:  这个参数可以将stmt的环境传进去。比如各种import和参数什么的。

  timer: 这个参数一般使用不到,具体使用可以参看文档。

  Timer类下面还有repeat和timeit方法 使用也非常方便就是 timeit.timeit 和  timeit.repeat。

  一个就是上面例子的timeit,一个就是repeat 其实repeat就比timeit多了一个执行Timer次数的参数。这个执行次数会以数组的形式返回.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

import timeit

foooo = """

sum = []

for i in range(1000):

    sum.append(i)

"""

print(timeit.repeat(stmt="[i for i in range(1000)]", repeat=2, number=100000))

print(min(timeit.repeat(stmt="[i for i in range(1000)]", repeat=2, number=100000)))

#res:

#[3.4540683642063277, 3.300991128415932]

#3.321008256502136

  我们可以根据此,对所有执行时间取min最小值,平均值,最大值得到我们想要的数据。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

# coding: utf-8

import timeit

# 初始化类

= """

say_hi.ParseFromString(p)

"""

= """

simplejson.loads(x)

"""

print(timeit.timeit(stmt=x, setup="import say_hi_pb2;"

                                  "say_hi = say_hi_pb2.SayHi();"

                                  "say_hi.id = 13423;"

                                  "say_hi.something = ‘axiba‘;"

                                  "say_hi.extra_info = ‘xiba‘;"

                                  "p =say_hi.SerializeToString()", number=1000000))

print(timeit.timeit(stmt=y, setup="import simplejson; "

                                  "json={"

                                  "‘id‘: 13423,"

                                  "‘something‘: ‘axiba‘,"

                                  "‘extra_info‘: ‘xiba‘,"

                                  "};"

                                  "x = simplejson.dumps(json)", number=1000000))<br> 

另外需要补充一点是,如果你想直接 stmt 那里执行函数。可以把函数申明在当前文件中,然后在 stmt = ‘func()’ 执行函数。然后使用 setup = ‘from __main__ import func’ 即可,如果要import 多个需要使用 setup = from __main__ import func; import simplejson‘

  


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

def test1():

    n=0

    for in range(101):

        n+=i

    return n

def test2():

    return sum(range(101))

def test3():

    return sum(x for in range(101))

if __name__==‘__main__‘:

    from timeit import Timer

    t1=Timer("test1()","from __main__ import test1")

    t2=Timer("test2()","from __main__ import test2")

    t3=Timer("test3()","from __main__ import test3")

    print(t1.timeit(10000))

    print(t2.timeit(10000))

    print(t3.timeit(10000))

    print(t1.repeat(3,10000))

    print(t2.repeat(3,10000))

    print(t3.repeat(3,10000))

    t4 = timeit.timeit(stmt=test1,setup="from __main__ import test1",number=10000)

    t5 = timeit.timeit(stmt=test2,setup="from __main__ import test2",number=10000)

    t6 = timeit.timeit(stmt=test3,setup="from __main__ import test3",number=10000)

    print(t4) #0.05130029071325269

    print(t5) #0.015494466822610305

    print(t6) #0.05650903115721077

    print(timeit.repeat(stmt=test1,setup="from __main__ import test1",number=10000)) # [0.05308853391023148, 0.04544335904366706, 0.05969025402337652]

    print(timeit.repeat(stmt=test2,setup="from __main__ import test2",number=10000)) # [0.012824560678924846, 0.017111019558035345, 0.01429126826003152]

    print(timeit.repeat(stmt=test3,setup="from __main__ import test3",number=10000)) # [0.07385010910706968, 0.06244617606430164, 0.06273494371932059]

#res:

0.043916918200588385

0.014892355541932578

0.05214884436618059

[0.043727137093980210.041971320524929080.04255431716177577]

[0.0143568041817379590.0124566037851773230.012629659578433372]

[0.05437092171153890.053341802940992720.05334931226535494]

  

原文地址:https://www.cnblogs.com/valorchang/p/11282126.html

时间: 2024-11-10 01:29:02

python之timeit模块的相关文章

Python 使用timeit模块计算时间复杂度时系统报“invalid syntax”错误

最近在看算法相关的文档 在时间复杂度环节 遇到一个实例: 导入timeit模块后,通过Timer定时器计算两种不同处理方法的时间复杂度 错误代码及报错如下图所示: 仔细查阅 发现from__main__import 不是一个连续的变量 而是由 from+__main__+import 三部分组合而成 将红框中的代码改为绿框中的代码之后 代码可以正确执行 正确结果如下: 原文地址:https://www.cnblogs.com/QianyuQian/p/12084433.html

如何使用python timeit模块使用实践

其实平时使用测试应用运行时间的情况 细算一下还真的很少.很久没有做性能优化的工作,不管是cProfile还是timeit模块都已经生疏了很久没有使用,我在以前的文章里面有提到过cPfile的性能测试使用,但是一直没有使用过这个更轻量级的运行时间测量库进行过仔细实践总结,今天就来总结一下. 从最简单的例子开始,比如我们想测试一个列表推导式究竟要比正常写for快多少. import timeit foooo = """ sum = [] for i in range(1000):

Python timeit模块

測试一段代码的执行时间.在python里面有个非常easy的方法,就是使用timeit模块.使用起来超级方便 以下简介一个timeit模块中的函数 主要就是这两个函数: 1,    timeit(stmt='pass', setup='pass', timer=<defaulttimer>, number=1000000) 返回: 返回运行stmt这段代码number遍所用的时间,单位为秒.float型 參数: stmt:要运行的那段代码 setup:运行代码的准备工作,不计入时间,通常是im

2 timeit模块,python中数据结构

1.timeit模块:代码事件测量模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>) Timer是测量小段代码执行速度的类. stmt参数是要测试的代码语句(statment): setup参数是运行代码时需要的设置: timer参数是一个定时器函数,与平台有关. timeit.Timer.timeit(number=1000000) T

PYTHON学习第二模块 python内置模块介绍

1 >>> import time 2 >>> time.time() 3 1491064723.808669 4 >>> # time.time()返回当前时间的时间戳timestamp(定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数)的方法,无参数 5 >>> time.asctime() 6 'Sun Apr 2 00:39:32 2017' 7 >>> # time.asctim

timeit模块 - 度量小段代码片的执行时间

官方文档: https://docs.python.org/2/library/timeit.html 源代码片: Lib/timeit.py 该模块提供了简单的方式来测量小段Python代码片.它有两种执行方式:命令行接口执行方式 和 Python程序代码可调的函数的方式. 该模块避免了很多常见的度量时间的陷进.可以参考由O'Reilly出版的Python Cookbook里面介绍算法章节. 1. 基本的例子 下面例子可以展示如果使用Command-Line Interface比较三种不同的表

每天一点算法(一)之timeit模块

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务.一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用. 算法是独立存在的一种解决问题的方法和思想. 一道题引入如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a.b.c可能的组合? 解决思路1: import time start_time = time.time() # 注意是三重循环 for

数据结构 --- 01. 时间复杂度,timeit模块,栈,队列,双端队列

一.时间复杂度 1.基本概念 评判程序优劣的方法: 消耗计算机资源和执行效率(无法直观) 计算算法执行的耗时(适当推荐,因为会受机器和执行环境的影响) 时间复杂度(推荐) 时间复杂度 评判规则:量化算法执行的操作/执行步骤的数量 最重要的项:时间复杂度表达式中最有意义的项 大O记法:O(时间复杂度表达式中最有意义的项) 常见的时间复杂度: O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O

Python中subprocess 模块 创建并运行一个进程

python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex cmd = "cat test.txt; rm test.txt" call(cmd, shell=True) 运行之后: 1:打开并浏览了test.txt文件 2:删除了test.txt文件 from subprocess import call import shlex cmd = &