python测量代码运行时间方法~

本文介绍如何使用Python内置的timeit模块进行代码运行时间的测量,包括Timer类的使用方法及实例,同时对比了不同方法的效率。

好久没repost&&write了,废了好久,好久。。。。。

-------------------------------------------------------------------------------------

Python 社区有句俗语: “python自己带着电池” ,别自己写计时框架。 Python 2.3 具备一个叫做 timeit 的完美计时工具可以测量python代码的运行时间。

timeit 模块

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

举例:

复制代码
# -*- coding: utf-8 -*-
#!/bin/env python

def test1():
    n=0
    for i in range(101):
        n+=i
    return n

def test2():
    return sum(range(101))

def test3():
    return sum(x for x 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(1000000)
    print t2.timeit(1000000)
    print t3.timeit(1000000)
    print t1.repeat(3,1000000)
    print t2.repeat(3,1000000)
    print t3.repeat(3,1000000)
复制代码

执行结果:

复制代码
   
tiny@tiny-desktop:~/workspace/py$ python timetest.py 7.99498915672 3.13702893257 10.6419789791
[8.2126381397247314, 8.6312708854675293, 8.6079621315002441]
[3.3426268100738525, 3.3914170265197754, 3.5281510353088379]
[11.097387075424194, 10.941920042037964, 10.874698877334595]
复制代码

利用time模块

利用time模块(仅作练习之用,不推荐)。 time.localtime(),  time.time(),  time.clock() 对比:

  • ime.localtime(),localtime返回的是struct_time,包含年月日,显然没有必要,更重要的是localtime()的精度依赖于time()
  • time.time(),time返回的是UTC时间(seconds since the 00:00:00 UTC on January 1)。在很多系统,包括windows下精度很差,win32下的精度只有1/18.2秒。不过在Unix/Linux系统下,time()的精度还是很高的。
  • Python的标准库手册推荐在任何系统下都尽量使用time.clock()。不过要注意是在win32系统下,这个函数返回的是真实时间(wall time),而在Unix/Linux下返回的是CPU时间。在win32下,这个函数的时间分辨率好于1微秒。

例:

复制代码
# -*- coding: utf-8 -*-
#!/bin/env python

def test():
    L=[]
    for i in range(100):
        L.append(i)

if __name__=='__main__':
    from time import clock
    start=clock()
    for i in range(1000000):
        test()
    finish=clock()
    print (finish-start)/1000000
复制代码

结果:

1.749e-05

其他方法

遇到复杂的程序,有很多性能分析工具可用。比如python的标准库里的profile可以统计程序里每一个函数的运行时间,并且提供了多样化的报表。(不了解,先记下来)

参考:

  1. http://docs.python.org/library/timeit.html
  2. http://woodpecker.org.cn/diveintopython/performance_tuning/timeit.html
  3. http://hi.baidu.com/shanyaodan0880/blog/item/b446617b7a98a5e42e73b3f2.html


Python提供了几种方法测量代码运行时间,以下是一些常用的方法: ### 使用`time`模块的`time.time()`函数 `time.time()`函数可以返回当前时间时间戳,通过在代码的开始和结束处调用该函数并计算两个时间戳之间的差值,即可获取代码运行时间。示例代码如下: ```python import time # 记录开始时间 start_time = time.time() # 执行代码 # ... # 记录结束时间 end_time = time.time() # 计算运行时间 run_time = end_time - start_time print("代码运行时间:", run_time, "秒") ``` 这种方法简单直接,适用于大多数场景,可以方便地测量一段代码的大致运行时间[^1]。 ### 使用高阶函数封装测量逻辑 可以将测量时间的相关代码放到一个高阶函数中,该函数接受要测量的函数作为参数,从而可以测量任意函数运行所需的时间。示例如下: ```python import time def measure_runtime(func): time_start = time.time() func() time_end = time.time() print(time_end - time_start) def powers(limit): return [x**2 for x in range(limit)] measure_runtime(lambda: powers(5000000)) ``` 通过这种方式,可以方便地对不同函数的运行时间进行测量,提高了代码的复用性[^3]。 ### 使用装饰器测量函数运行时间 可以定义一个装饰器来测量函数的运行时间,示例代码如下: ```python import time from functools import wraps def print_func_time(function): ''' 计算程序运行时间 ''' @wraps(function) def func_time(*args, **kwargs): t0 = time.clock() result = function(*args, **kwargs) t1 = time.clock() print("Total running time: %s s" % (str(t1 - t0))) return result return func_time @print_func_time def test_function(): # 这里放置要测量代码逻辑 L = [] for i in range(100): L.append(i) test_function() ``` 使用装饰器可以更优雅地对函数的运行时间进行测量,只需在需要测量的函数定义前添加装饰器即可[^4]。 ### 另一种简单示例 ```python from time import clock def test(): L = [] for i in range(100): L.append(i) if __name__ == '__main__': start = clock() for i in range(1000000): test() finish = clock() print((finish - start) / 1000000) ``` 这种方式同样是通过记录开始和结束时间,计算差值来得到代码运行时间,并且可以根据需要进行多次循环测试,以得到更准确的结果[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值