4、高性能编码于调试
4.1 输出错误和警告信息
4.1.1 向标准错误输出信息
代码展示 一:
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2022-01-11 import sys #向标准错误输出信息 sys.stderr.write('')
4.1.2 输出警告信息
代码展示 一:
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2022-01-11 import warnings #输出警告信息 warnings.warn(message, category=UserWarning)
4.1.3 控制警告消息的输出
代码展示 一:
# 输出所有警告,等同于设置warnings.simplefilter('always') >>python -W all # 忽略所有警告,等同于设置warnings.simplefilter('ignore') >>python -W ignore >
4.2 代码中测试
代码展示 一:
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2022-01-11 ''' 为了调试,我们想在代码中加一些代码,通常是一些 print 语句 ''' # 在代码中的debug部分 if __debug__: pass
调试结束,在执行命令中输入 -0,忽略此部分代码
>> python -0 main.py
4.3 代码风格检查
代码展示 一:
使用pylint进行代码风格和语法检查,能在运行之前发现一些错误信息
>> pylint main.py
4.4 代码耗时
代码展示 一:
测试耗时
>> python -m cProfile main.py
代码展示 二:
测试某块代码耗时
# -*- coding: utf-8 -*- # @ auth : carl_DJ # @ time : 2022-01-11 # 代码块耗时定义 from contextlib import contextmanager from time import perf_counter @contextmanager def timeblock(label): tic = perf_counter() try: yield finally: toc = perf_counter() print('%s : %s' % (label, toc - tic)) # 代码块耗时测试 with timeblock('counting'): pass
代码耗时优化的原则,如下:
专注于优化产生性能瓶颈的地方,而不是全部代码。
避免使用全局变量。局部变量的查找比全局变量更快,将全局变量的代码定义在函数中运行通常会快 15%-30%。
避免使用.访问属性。使用 from module import name 会更快,将频繁访问的类的成员变量 self.member 放入到一个局部变量中。
尽量使用内置数据结构。str, list, set, dict 等使用 C 实现,运行起来很快。
避免创建没有必要的中间变量,和 copy.deepcopy()。
字符串拼接,例如 a + ‘:’ + b + ‘:’ + c 会创造大量无用的中间变量,’:’,join([a, b, c]) 效率会高不少。另外需要考虑字符串拼接是否必要,例如 print(’:’.join([a, b, c])) 效率比 print(a, b, c, sep=’:’) 低。
5、其他小技巧
5.1 argmin 和 argmax
代码展示 一:
items = [2, 1, 3, 4] #计算 ‘arg’ 最小值 ‘val’ 价值 argmin = min(range(len(items)), key=items.__getitem__) #计算 ‘arg’ 最大值 ‘val’ 价值 argmax = max(range(len(items)), key=items.__getitem__)
5.2 转置二维列表
代码展示 一:
A = [['a11', 'a12'], ['a21', 'a22'], ['a31', 'a32']] #数组 A_transpose = list(zip(*A)) #列表 A_transpose = list(list(col) for col in zip(*A))
5.3 一维列表展开为二维列表
代码展示 一:
A = [1, 2, 3, 4, 5, 6] list(zip(*[iter(A)] * 2))