后记补充
我们整个工具包都开源了:https://github.com/XLPRUtils/pyxllib,
并且放在pypi,可以使用下述方式安装:
pip install pyxllib
常见基础功能可以使用
from pyxllib.basic import *
原来的debuglib功能可以使用
from pyxllib.debug import *
dprint、chrome等函数的功能都在,而且后来有很多bug的修复完善。
但目前还可能有不少不稳定的地方,欢迎遇到bug随时提给我,或者使用别扭的地方可以反馈建议给我。
有在计划写文档了,但目前还不是很完善,可以将就先看着用用: https://www.yuque.com/xlpr/pyxllib
更多使用细节规范,暂时可以阅读源码,很多函数的接口还是讲的比较详细的。
0 序
如果下述问题也困扰着你,又或仍在使用“新手做法”,那么本文值得一读。
常见问题 | 新手做法 | debuglib分享方法 | 标准处理方法 |
---|---|---|---|
程序计时,速度性能分析 | t0 = time.clock() … print(‘xxx用时%.2f\n’ % (time.clock() - t0)) |
timer = Timer(‘xxx’, start_now=True) … timer.stop_and_report() |
timeit模块 IDE的Profile功能 |
查看程序是否运行到某个位置 | print(123) … print(321) |
dprint() | IDE断点功能 |
查看变量值,监控过程 | print(a) print(‘a=’, a) |
dprint(a, b, c) | IDE监控变量 log日志模块 |
异常警告 | 不处理特殊情况或者直接raise报错 | dprint(a, b) # 异常信息 | warnings模块 |
表格等数据的对齐输出 | 靠火眼金睛看print的输出 | chrome() | pprint模块 pandas模块 |
查看对象的类型和成员变量、方法 | 不知道变量是什么类型, 吐槽动态语言不好用 |
showdir(ob) | 跳转查源码Structure 查官方文档 |
上面第4列给出了这些问题工程上比较规范的做法,有不清楚的读者自己找资料了解,网上的资料很多本文不过多介绍,重点是要分享我的debuglib.py工具。如果把标准做法看成是PhotoShop软件,那么我所要分享的工具就是美图秀秀,论专业和严谨我的工具自然是无法和IDE的调试功能相比的,但有时候我们只是遇到一个小问题,杀鸡焉用牛刀?我的工具有一些精巧的设计封装,一切设计都是为了便捷、方便快速,又比“新手做法”的“画图软件”强大的多。
后文的介绍依赖debuglib.py源码 ,不过也不需要用里面的所有代码,读者有感兴趣的功能可以做代码摘选而不是复制整个脚本文件来使用。有些函数接口支持非常灵活的扩展功能,本文无法面面俱到地介绍,有需要使用的读者可以读源码,源码中也有很完善的文档注释。
当然,毕竟不是标准的调试操作,这些东西必然存在争议,也欢迎大家的评论和优化。
希望我的代码至少能给大家带来调试效率方面的思索和灵感。
这些技巧并不局限于Python语言,这是用任何编程语言开发都值得思考的问题。
作者:陈坤泽
邮箱:877362867@qq.com
1 程序计时
time.clock()是有bug的,不同的平台应该使用的计时器不同,最好用timeit中的配置:timeit.default_timer。考虑到还有输出计时标签、多次运行计算平均时间等需求,我们可以封装好一个Timer类更方便使用。
def demo_timer():
"""该函数也可以用来测电脑性能"""
print('1、普通用法(循环5*1000万次用时)')
timer = Timer('循环', start_now=True)
for _ in range(5):
for _ in range(10 ** 7):
pass
timer.stop_and_report()
print('2、循环多轮计时(循环5*1000万次用时)')
timer = Timer()
for _ in range(5):
timer.start()
for _ in range(10 ** 7):
pass
timer.stop_and_report()
print('3、with上下文用法')
with Timer('循环'):
for _ in range(5):
for _ in range(10 ** 6):
pass
# 1、普通用法(循环5*1000万次用时)
# 循环 CumuTime: 0.834s, #run: 1, AvgTime: 0.834s
# 2、循环多轮计时(循环5*1000万次用时)
# CumuTime: 0.157s, #run: 1, AvgTime: 0.157s
# CumuTime: 0.314s, #run: 2, AvgTime: 0.157s
# CumuTime: 0.470s, #run: 3, AvgTime: 0.157s
# CumuTime: 0.626s, #run: 4, AvgTime: 0.157s
# CumuTime: 0.787s, #run: 5, AvgTime: 0.157s
# 3、上下文用法
# 循环 CumuTime: 0.080s, #run: 1, AvgTime: 0.080s
2 过程与变量监控
2.1 查看程序是否运行到某个位置
假设我们现在要开发一个计算 a b m o d m a^b \mod m abmodm的程序,从一个有问题的代码来举例如何用dprint工具进行排查解决bug。
初始test.py代码如下:
a, b, m = map(int, input().split()) # 从控制台输入一行字符串,例如`2 2 3`,读取成3个整数值
if m is True:
n = a ^ b
a = n % m
print(a