当前位置:   article > 正文

python性能分析之log_python複製log和讀取log耗費的電腦資源相同嗎

python複製log和讀取log耗費的電腦資源相同嗎

最近在优化一个Python项目,里面包含很多set,list,dict等操作,代码行数2000多行,每次运行耗时都在30-50ms,本以为是Python语言的动态解析特性导致运行性能太低,便尝试使用JIT工具进行优化,折腾一番之后,性能只提升20%,远没有官方介绍的6倍之多,反复查看代码,想到了IO耗时的问题,而是怀疑log输出到控制台耗时是否是罪魁祸首,实验下来发现的确如此。

实验内容:

分别对比,运行下面代码,记录耗时情况,结果:

  • 运行1000次  加法: 0.5578994750976562 ms
  • 运行1000次  空logging: 3.5049915313720703 ms
  • 运行1000次  控制台输出logging: 50.84490776062012 ms
  • 运行1000次  控制台输出loguru: 135.09225845336914 ms
  • 运行1000次  空loguru: 1.0859966278076172 ms
  • 运行1000次  控制台print: 3.3588409423828125 ms
  • 运行1次        控制台1000倍字符长度print: 0.051975250244140625 ms
  • 运行1次        控制台1000倍字符长度logging: 0.25582313537597656 ms
  • 运行1次        控制台1000倍字符长度logger: 0.0059604644775390625 ms
  • 运行1次        加法: 0.0030994415283203125 ms
  • 运行1000次  控制台print: 3.3588409423828125 ms
  • 运行1000次  python文件流方式输出到stdout: 0.9961128234863281 ms
  • 运行1000次  python文件流方式输出到文件: 1.2679100036621094 ms
  • 运行1000次  loguru文件流方式输出到文件: 192.5220489501953 ms

结论:

1.log写入文件效率高于stdout,优先选择写文件

2.log输出到控制台,直接print和定向到stdout的效率都低于以文件流的方式写入/dev/stdout,优先选择文件流写入

3.loguru写文件效率都较低,准备自己实现log简易功能

代码

  1. import logging
  2. from loguru import logger
  3. import time
  4. s1 = time.time()
  5. for i in range(1000):
  6. i = i + float("0.0000009998980")
  7. s2 = time.time()
  8. for i in range(1000):
  9. logging.info(f"我是第{i}次记录log")
  10. s3 = time.time()
  11. for i in range(1000):
  12. logging.error(f"我是第{i}次记录log")
  13. s4 = time.time()
  14. for i in range(1000):
  15. logger.error(f"我是第{i}次记录log")
  16. logger.remove(handler_id=None)
  17. s5 = time.time()
  18. for i in range(1000):
  19. logger.error(f"我是第{i}次记录log")
  20. s6 = time.time()
  21. for i in range(1000):
  22. print(f"我是第{i}次记录log")
  23. s7 = time.time()
  24. s8 = time.time()
  25. print(f"我是第8次记录log" * 1000)
  26. s9 = time.time()
  27. logging.error(f"我是第8次记录log" * 1000)
  28. s10 = time.time()
  29. logger.error(f"我是第8次记录log" * 1000)
  30. s11 = time.time()
  31. i = 8 + float("0.0000009998980")
  32. s12 = time.time()
  33. f1 = open("/dev/stdout","w")
  34. s13 = time.time()
  35. for i in range(1000):
  36. f1.write(f"我是第{i}次记录log\n")
  37. s14 = time.time()
  38. f1.close()
  39. f2 = open("./test.log","w")
  40. s15 = time.time()
  41. for i in range(1000):
  42. f2.write(f"我是第{i}次记录log\n")
  43. s16 = time.time()
  44. f2.close()
  45. logger.add("test.loguru")
  46. s17 = time.time()
  47. for i in range(1000):
  48. logger.error(f"我是第{i}次记录log\n")
  49. s18 = time.time()
  50. print("运行1000次 加法:", (s2 - s1) * 1000, "ms")
  51. print("运行1000次 空logging:", (s3 - s2) * 1000, "ms")
  52. print("运行1000次 控制台输出logging:", (s4 - s3) * 1000, "ms")
  53. print("运行1000次 控制台输出loguru:", (s5 - s4) * 1000, "ms")
  54. print("运行1000次 空loguru:", (s6 - s5) * 1000, "ms")
  55. print("运行1000次 控制台print:", (s7 - s6) * 1000, "ms")
  56. print("运行1次 控制台1000倍字符长度print:", (s9 - s8) * 1000, "ms")
  57. print("运行1次 控制台1000倍字符长度logging:", (s10 - s9) * 1000, "ms")
  58. print("运行1次 控制台1000倍字符长度logger:", (s11 - s10) * 1000, "ms")
  59. print("运行1次 加法:", (s12 - s11) * 1000, "ms")
  60. print("运行1000次 控制台print:", (s7 - s6) * 1000, "ms")
  61. print("运行1000次 python文件流方式输出到stdout:", (s14 - s13) * 1000, "ms")
  62. print("运行1000次 python文件流方式输出到文件:", (s16 - s15) * 1000, "ms")
  63. print("运行1000次 loguru文件流方式输出到文件:", (s18 - s17) * 1000, "ms")

实验机器:

python常见的性能瓶颈:数据库慢查询SQL、日志打印、xml大报文解析和格式转换、复杂业务逻辑、锁竞争等。 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/78331
推荐阅读
相关标签
  

闽ICP备14008679号