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对性能测试造成严重不准确。

 

posted @ 2021-11-24 15:03  北风之神0509  阅读(2703)  评论(0编辑  收藏  举报