python优化分析工具

除了上次介绍的内置的一些方法外内置方法和系统方法
还有很多工具

line_profiler

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)

详细看到函数每一行的开销,思考着去做优化

memory_profiler

查看每行的内存开销
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)
dis

将程序转成机器码看是否有不当操作
需要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 (<code object <lambda> at 0x10e4db530, file "dp.py", line 18>)
             43 MAKE_FUNCTION            0
             46 STORE_NAME               5 (LEFT)

 19          49 LOAD_CONST               5 (<code object <lambda> 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 (<code object HEAPIFY 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 (<code object BUILD_MAX_HEAP 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 (<code object HEAPSORT 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 (<code object main 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

于是开始分析机器码上能不能优化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值