1.time.time() 简单的计时器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python
import time
def timefunc(f):    
    def f_timer(*args, **kwargs):
        start = time.time()
        result = f(*args, **kwargs)
        end = time.time()        
        print f.__name__, 'took', end - start, 'time'        
        return result    
    return f_timer


@timefunc
def test():
    for i in xrange(100):
        print i

test()

2.timeit模块

2.1.python shell中使用

1
2
import timeit
timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)

2.2 脚本中使用

1
2
3
4
5
6
7
8
#!/usr/bin/python
import timeit
def test():
    for i in xrange(1000):
        print i
    
if __name__ == '__main__':
    timeit.timeit('test()', setup='from __main__ import test', number=1)

3.cProfile

python -m cProfile -s cumulative a.py

4.linux time命令

1
2
3
4
/usr/bin/time -f "Memory: %M bytes" python script.py

Time using for-loop: 0.155635 seconds 
Memory: 66212 bytes

5.line_profiler 每行比对 调用次数 耗时

适用于分析单独函数 安装 pip install line_profiler

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import line_profiler
import sys

def fib(n):
    a, b = 0, 1
    for i in range(0, n):
        a, b = b, a + b
        return a


prof = line_profiler.LineProfiler(fib)
prof.enable()
fib(100)
prof.disable()
prof.print_stats(sys.stdout)

执行 kernprof -l -v script_to_profile.py 查看pstat python -m line_profiler stats_file.py.lprof

6.memory_profiler模块 分析内存使用情况

1
2
3
4
5
6
7
8
9
class Foobar(object):
    def __init__(self, x):
    self.x = x
    
@profile 
def main():
    f = [ Foobar(i) for i in range(100000) ]
if __name__ == '__main__':
    main()

执行 python -m memory_profiler example.py

7.bytecode 字节码

dis模块

1
2
3
4
5
6
7
>>> def x():
...     return 42 
...
>>> import dis
>>> dis.dis(x) 
2   0 LOAD_CONST     1 (42)
    3 RETURN_VALUE  

8.性能分析装饰器定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import cProfile
import pstats
import os
def do_cprofile(func):
    def wrapper(*args, **kwargs):
        profile = cProfile.Profile()
        # 开始收集性能分析数据
        profile.enable()
        result = func(*args, **kwargs)
        # 停止收集性能分析数据
        profile.disable()
        # Sort stat by internal time.
        sortby = "tottime"
        # 对报告列表进行排序
        ps = pstats.Stats(profile).sort_stats(sortby)
        # 把信息打印到标准输出
        ps.print_stats()
        return result
    return wrapper
    
    
@do_cprofile 
def test():
    for i in range(100):
        print(i)

if __name__ == '__main__':
    test()

9.利用cProfile+gprof2dot可视化

具体参考:

https://ephrain.net/python-%E7%94%A8-cprofilegprof2dot-%E5%B0%87-profiling-%E7%B5%90%E6%9E%9C%E8%A6%96%E8%A6%BA%E5%8C%96

https://github.com/jrfonseca/gprof2dot