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

    反对极端面向过程编程思维方式,喜欢面向对象和设计模式的解读,喜欢对比极端面向过程编程和oop编程消耗代码代码行数的区别和原因。致力于使用oop和36种设计模式写出最高可复用的框架级代码和使用最少的代码行数完成任务,致力于使用oop和设计模式来使部分代码减少90%行,使绝大部分py文件最低减少50%-80%行的写法。
  • 相关阅读:
    875. 家的范围
    Codeforces 1260D A Game with Traps(二分查找)
    Codeforces 1260D A Game with Traps(二分查找)
    Codeforces 1260C Infinite Fence(扩展欧几里得有解的条件)
    Codeforces 1260C Infinite Fence(扩展欧几里得有解的条件)
    Codeforces 1260B Obtain Two Zeroes
    Codeforces 1260B Obtain Two Zeroes
    Codeforces1260A Heating
    Codeforces1260A Heating
    HDU 2795 Billboard(线段树查询区间最大值)
  • 原文地址:https://www.cnblogs.com/ydf0509/p/15598156.html
Copyright © 2020-2023  润新知