用简单的堆排序来查看这些工具
今天先看一些内建工具
自己写一个装饰器
注释掉的部分是将尾递归省略掉的方法,理论上会提升效率,我用来做比较的
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