python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。
很多人做性能测试,吧print打开,吧log调到debug级别并使用了streamhandler,那就会疯狂打印到控制台。
打印控制台会影响代码性能吗?这是毫无疑问的,python print会严重影响python性能。
有很多人对分布式函数调度框架做性能测试,但在消费函数里面进行print并且框架日志级别没有设为INFO,造成框架的性能结果严重大幅度下降,每次都要解释很久print是io行为,会严重影响代码的性能。
如果你在对任何python代码做性能测试,千万别print,你疯狂print就会造成代码性能下降,你万万没想到print也会对性能产生严重影响,只是误以为代码要优化。
下面就来看证明吧。
调用10万次add函数求和,使用严谨的控制变量法测试,测试用例如下:
1.pycahrm中调用10万次求和,但不打印结果,统计运行时间 (主要是测试不打印结果和打印少量字符串和打印很长字符串 的影响)
2.pycahrm中调用10万次求和,打印20个文字左右的长度来显示求和结果,统计运行时间 (主要是测试不打印结果和打印少量字符串和打印很长字符串 的影响)
3.pycahrm中调用10万次求和,打印500个文字左右的长度来显示求和结果,统计运行时间 (主要是测试不打印结果和打印少量字符串和打印很长字符串 的影响)
4.在cmd,把cmd窗口用鼠标缩放调成中等大小,宽10cm高10cm,运行10万次求和,打印500个文字左右的长度来显示求和结果,统计运行时间 (主要是用来测试不同窗口大小渲染print的影响)
5.在cmd,把cmd窗口用鼠标缩放调成很小,宽3cm高3cm,运行10万次求和,打印500个文字左右的长度来显示求和结果,统计运行时间 (主要是用来测试不同窗口大小渲染print的影响)
6.在cmd,把cmd窗口用鼠标缩放调成最大化,运行10万次求和,打印500个文字左右的长度来显示求和结果,统计运行时间(主要是用来测试不同窗口大小渲染print的影响,并且可以对比pycahrm运行时的耗时)
7.在cmd,把cmd窗口用鼠标缩放调成很小,宽3cm高3cm,运行10万次求和,但不打印结果,统计运行时间 (主要是用来证明不print求和结果性能很好)
测试代码如下:
import time def add(x,y): return x +y t1 = time.time() for i in range(100000): # 只调用求和函数不打印结果,统计运行时间 # add(i, i * 2) # 打印20个文字左右的长度来显示求和结果,统计运行时间 # print(f'''{time.strftime("%H:%M:%S")} {i} + {i * 2} = {add(i, i * 2)}''') # 打印500个文字左右的长度来显示求和结果,统计运行时间 print(f'''python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。 {time.strftime("%H:%M:%S")} {i} + {i*2} = {add(i,i*2)}''') print("耗时:",time.time() -t1)
运行结果:
1.pycahrm中调用10万次求和,但不打印结果,统计运行时间 (主要是测试不打印结果和打印少量字符串和打印很长字符串 的影响),耗时0.02秒
2.pycahrm中调用10万次求和,打印20个文字左右的长度来显示求和结果,统计运行时间 (主要是测试不打印结果和打印少量字符串和打印很长字符串 的影响),耗时0.89秒
3.pycahrm中调用10万次求和,打印500个文字左右的长度来显示求和结果,统计运行时间 (主要是测试不打印结果和打印少量字符串和打印很长字符串 的影响),耗时4.11
4.在cmd,把cmd窗口用鼠标缩放调成中等大小,宽10cm高10cm,运行10万次求和,打印500个文字左右的长度来显示求和结果,统计运行时间 (主要是用来测试不同窗口大小渲染print的影响),耗时 1400秒
5.在cmd,把cmd窗口用鼠标缩放调成很小,宽3cm高3cm,运行10万次求和,打印500个文字左右的长度来显示求和结果,统计运行时间 (主要是用来测试不同窗口大小渲染print的影响),耗时7100秒
6.在cmd,把cmd窗口用鼠标缩放调成最大化,运行10万次求和,打印500个文字左右的长度来显示求和结果,统计运行时间(主要是用来测试不同窗口大小渲染print的影响,并且可以对比pycahrm运行时的耗时),耗时300秒
7.在cmd,把cmd窗口用鼠标缩放调成很小,宽3cm高3cm,运行10万次求和,但不打印结果,统计运行时间 (主要是用来证明不print求和结果性能很好),耗时0.02秒
解释一下什么叫 cmd窗口大小:
可以通过鼠标拉伸改变cmd窗口大小。
二、实验结论:
通过实验的结果得出结论:
pycahrm下打印短字符串结果比不打印结果耗时增加了40倍。
pycahrm下打印长字符串结果比打印短字符串耗时增加了5倍。
cmd窗口最大化,打印长字符串比pycahrm打印长字符串结果耗时增加了近100倍
cmd窗口调整成3cm大小时候,比cmd窗口最大化,打印长字符串耗时增加了25倍
cmd窗口调整成10cm大小时候,比cmd窗口最大化,打印长字符串耗时增加了5倍
充分的说明疯狂的进行print会非常显著严重影响代码的运行速度,print打印到控制台的速度会受到终端渲染性能的影响,
pycahrm是对代码输出优化了,会明显的批量缓存输出,性能明显好于在cmd窗口中疯狂print。
cmd窗口最大化时候,渲染输出性能最好,cmd窗口调成最小时候,print性能最差。
最好的情况是运行10万次求和不打印结果,耗时0.02秒,最差的情况是运行10万次求和并在3cm的cmd窗口中渲染输出结果耗时7100秒,简直是相差了数十万倍,你还以为在代码里面高频次的疯狂print没影响吗。
所以有的人在测我的分布式函数调度框架性能时候,我建议在消费函数中别print。并且 @task_deco装饰器
中设置 log_level=20 ,20就是常量logging.INFO的值,因为这样会大量减少屏幕控制台的输出,会使框架消费性能大幅度提高。疯狂print对性能测试造成严重不准确。