除了上次介绍的内置的一些方法外内置方法和系统方法
还有很多工具
pip install line_profiler安装
需要在被测的函数前加上@profile,还是用上次的堆排程序试一下
wujingcideMacBook-Pro:test wujingci$ kernprof -l -v dp.py
Wrote profile results to dp.py.lprof
Timer unit: 1e-06 s
Total time: 0.452889 s
File: dp.py
Function: HEAPIFY at line 27
Line # Hits Time Per Hit % Time Line Contents
==============================================================
27 @profile
28 def HEAPIFY(A, i):
29 15000 5884.0 0.4 1.3 while True:
30 129154 148879.0 1.2 32.9 l, r = LEFT(i), RIGHT(i)
31 129154 74040.0 0.6 16.3 largest = l if l < heap_size and A[l] > A[i] else i
32 129154 70603.0 0.5 15.6 largest = r if r < heap_size and A[r] > A[largest] else largest
33 129154 51611.0 0.4 11.4 if i == largest: break
34 114154 60589.0 0.5 13.4 A[i], A[largest] = A[largest], A[i]
35 114154 41283.0 0.4 9.1 i = largest
Total time: 0.082947 s
File: dp.py
Function: BUILD_MAX_HEAP at line 38
Line # Hits Time Per Hit % Time Line Contents
==============================================================
38 @profile
39 def BUILD_MAX_HEAP(A):
40 global heap_size
41 1 3.0 3.0 0.0 heap_size = len(A)
42 5001 2263.0 0.5 2.7 for i in range(len(A)//2-1,-1,-1):
43 5000 80681.0 16.1 97.3 HEAPIFY(A,i)
Total time: 0.739746 s
File: dp.py
Function: HEAPSORT at line 45
Line # Hits Time Per Hit % Time Line Contents
==============================================================
45 @profile
46 def HEAPSORT(A):
47 global heap_size
48 1 86524.0 86524.0 11.7 BUILD_MAX_HEAP(A)
49 10001 4412.0 0.4 0.6 for i in range(len(A)-1,-1,-1):
50 10000 6247.0 0.6 0.8 A[i], A[0] = A[0], A[i]
51 10000 5433.0 0.5 0.7 heap_size -= 1
52 10000 637130.0 63.7 86.1 HEAPIFY(A,0)
Total time: 0.826482 s
File: dp.py
Function: main at line 55
Line # Hits Time Per Hit % Time Line Contents
==============================================================
55 @profile
56 def main():
57 1 3.0 3.0 0.0 a = []
58 10001 4716.0 0.5 0.6 for i in range(10000):
59 10000 55097.0 5.5 6.7 a.append(random.randint(0,100000))
60 1 88.0 88.0 0.0 print("before")
61 1 7802.0 7802.0 0.9 print(a)
62 1 294.0 294.0 0.0 print("\nafter")
63 1 753466.0 753466.0 91.2 HEAPSORT(a)
64 1 5016.0 5016.0 0.6 print(a)
详细看到函数每一行的开销,思考着去做优化
查看每行的内存开销
pip install memory_profiler安装
Filename: dp.py
Line # Mem usage Increment Line Contents
================================================
27 34.082 MiB 511210.934 MiB @profile
28 def HEAPIFY(A, i):
29 34.082 MiB 0.000 MiB while True:
30 34.082 MiB 0.000 MiB l, r = LEFT(i), RIGHT(i)
31 34.082 MiB 0.000 MiB largest = l if l < heap_size and A[l] > A[i] else i
32 34.082 MiB 0.000 MiB largest = r if r < heap_size and A[r] > A[largest] else largest
33 34.082 MiB 0.000 MiB if i == largest: break
34 34.082 MiB 0.000 MiB A[i], A[largest] = A[largest], A[i]
35 34.082 MiB 0.000 MiB i = largest
Filename: dp.py
Line # Mem usage Increment Line Contents
================================================
38 34.078 MiB 34.078 MiB @profile
39 def BUILD_MAX_HEAP(A):
40 global heap_size
41 34.078 MiB 0.000 MiB heap_size = len(A)
42 34.078 MiB 0.000 MiB for i in range(len(A)//2-1,-1,-1):
43 34.078 MiB 170390.625 MiB HEAPIFY(A,i)
Filename: dp.py
Line # Mem usage Increment Line Contents
================================================
45 34.074 MiB 34.074 MiB @profile
46 def HEAPSORT(A):
47 global heap_size
48 34.078 MiB 34.078 MiB BUILD_MAX_HEAP(A)
49 34.082 MiB 0.004 MiB for i in range(len(A)-1,-1,-1):
50 34.082 MiB 0.000 MiB A[i], A[0] = A[0], A[i]
51 34.082 MiB 0.000 MiB heap_size -= 1
52 34.082 MiB 340820.309 MiB HEAPIFY(A,0)
Filename: dp.py
Line # Mem usage Increment Line Contents
================================================
55 33.730 MiB 33.730 MiB @profile
56 def main():
57 33.730 MiB 0.000 MiB a = []
58 34.000 MiB 0.000 MiB for i in range(10000):
59 34.000 MiB 0.270 MiB a.append(random.randint(0,100000))
60 34.012 MiB 0.012 MiB print("before")
61 34.074 MiB 0.062 MiB print(a)
62 34.074 MiB 0.000 MiB print("\nafter")
63 34.082 MiB 34.082 MiB HEAPSORT(a)
64 34.258 MiB 0.176 MiB print(a)
将程序转成机器码看是否有不当操作
需要pip install dis
代码里需要增加
wujingcideMacBook-Pro:test wujingci$ python -m dis dp.py
2 0 LOAD_CONST 0 (-1)
3 LOAD_CONST 1 (None)
6 IMPORT_NAME 0 (random)
9 STORE_NAME 0 (random)
15 12 LOAD_CONST 0 (-1)
15 LOAD_CONST 2 (('hpy',))
18 IMPORT_NAME 1 (guppy)
21 IMPORT_FROM 2 (hpy)
24 STORE_NAME 2 (hpy)
27 POP_TOP
16 28 LOAD_NAME 2 (hpy)
31 STORE_NAME 3 (hp)
17 34 LOAD_CONST 3 (0)
37 STORE_GLOBAL 4 (heap_size)
18 40 LOAD_CONST 4 ( at 0x10e4db530, file "dp.py", line 18>)
43 MAKE_FUNCTION 0
46 STORE_NAME 5 (LEFT)
19 49 LOAD_CONST 5 ( at 0x10e4db330, file "dp.py", line 19>)
52 MAKE_FUNCTION 0
55 STORE_NAME 6 (RIGHT)
28 58 LOAD_NAME 7 (profile)
61 LOAD_CONST 6 (at 0x10e4db3b0, file "dp.py", line 28>)
64 MAKE_FUNCTION 0
67 CALL_FUNCTION 1
70 STORE_NAME 8 (HEAPIFY)
39 73 LOAD_NAME 7 (profile)
76 LOAD_CONST 7 (at 0x10e4db430, file "dp.py", line 39>)
79 MAKE_FUNCTION 0
82 CALL_FUNCTION 1
85 STORE_NAME 9 (BUILD_MAX_HEAP)
46 88 LOAD_NAME 7 (profile)
91 LOAD_CONST 8 (at 0x10e4db4b0, file "dp.py", line 46>)
94 MAKE_FUNCTION 0
97 CALL_FUNCTION 1
100 STORE_NAME 10 (HEAPSORT)
56 103 LOAD_NAME 7 (profile)
106 LOAD_CONST 9 (at 0x10e4db6b0, file "dp.py", line 56>)
109 MAKE_FUNCTION 0
112 CALL_FUNCTION 1
115 STORE_NAME 11 (main)
67 118 LOAD_NAME 12 (__name__)
121 LOAD_CONST 10 ('__main__')
124 COMPARE_OP 2 (==)
127 POP_JUMP_IF_FALSE 140
68 130 LOAD_NAME 11 (main)
133 CALL_FUNCTION 0
136 POP_TOP
137 JUMP_FORWARD 0 (to 140)
>> 140 LOAD_CONST 1 (None)
143 RETURN_VALUE
于是开始分析机器码上能不能优化