python 装饰器/Cprofile计算函数执行时间

用简单的堆排序来查看这些工具
今天先看一些内建工具

自己写一个装饰器

注释掉的部分是将尾递归省略掉的方法,理论上会提升效率,我用来做比较的

wujingcideMacBook-Pro:test wujingci$ cat dp.py
# encoding: utf-8
import random
from functools import wraps
import time

def timefn(function):
    @wraps(function)
    def count_time(*args, **kwargs):
        t1 = time.time()
        result = function(*args, **kwargs)
        t2 = time.time()
        print (function.func_name + ' took ' + str(t2-t1) + ' seconds')
        return result
    return count_time

heap_size = 0
LEFT = lambda i: 2*i+1
RIGHT = lambda i: 2*i+2
# 维护最大堆
def HEAPIFY(A, i):
    l, r = LEFT(i), RIGHT(i)
    largest = l if l < heap_size and A[l] > A[i] else i # 最小堆则改为 A[l] < A[i]
    largest = r if r < heap_size and A[r] > A[largest] else largest # 最小堆则改为A[r] < A[largest]
    if i != largest:
        A[i], A[largest] = A[largest], A[i]
        HEAPIFY(A,largest)
# 去除尾递归
#def HEAPIFY(A, i):
#    while True:
#        l, r = LEFT(i), RIGHT(i)
#        largest = l if l < heap_size and A[l] > A[i] else i
#        largest = r if r < heap_size and A[r] > A[largest] else largest
#        if i == largest: break
#        A[i], A[largest] = A[largest], A[i]
#        i = largest
# 构建最大堆
def BUILD_MAX_HEAP(A):
    global heap_size
    heap_size = len(A)
    for i in range(len(A)//2-1,-1,-1):
        HEAPIFY(A,i)
# 堆排序
def HEAPSORT(A):
    global heap_size
    BUILD_MAX_HEAP(A)
    for i in range(len(A)-1,-1,-1):
        A[i], A[0] = A[0], A[i]
        heap_size -= 1
        HEAPIFY(A,0)

@timefn
def main():
    a = []
    for i in range(10000):
        a.append(random.randint(0,100000))
    print 'before'
    print a
    print '\nafter'
    HEAPSORT(a)
    print a

if __name__ == "__main__":
    main()

跑一下,运行了main took 0.189006090164 seconds
这个是有差异化的,不过我们可以试着去掉尾递归main took 0.150513887405 seconds
貌似快一点,不过这说明不了什么,因为随机产生的数列要进行的元素交换次数不一样

用unix的time命令

将装饰器注释掉

time -p python dp.py
real         0.14
user         0.10
sys          0.01
用cprofile
         428031 function calls (313707 primitive calls) in 0.183 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001    0.183    0.183 dp.py:2(<module>)
        1    0.017   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值