为什么在Python 3.3中打印速度如此之慢,我该如何解决?

蒂莫

我只是尝试使用Python 3.3运行此脚本。不幸的是,它的速度是Python 2.7的两倍。

#!/usr/bin/env python

from sys import stdin

def main():
    for line in stdin:
        try:
            fields = line.split('"', 6)
            print(fields[5])
        except:
            pass

if __name__ == '__main__':
    main()

结果如下:

$ time zcat access.log.gz | python3 -m cProfile ./ua.py > /dev/null

real    0m13.276s
user    0m18.977s
sys     0m0.484s

$ time zcat access.log.gz | python2 -m cProfile ./ua.py > /dev/null

real    0m6.139s
user    0m11.693s
sys     0m0.408s

分析显示,额外的时间花费在打印上:

$ zcat access.log.gz | python3 -m cProfile ./ua.py | tail -15
   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:1594(_handle_fromlist)
   196806    0.234    0.000    0.545    0.000 codecs.py:298(decode)
        1    0.000    0.000   13.598   13.598 ua.py:3(<module>)
        1    4.838    4.838   13.598   13.598 ua.py:6(main)
        1    0.000    0.000   13.598   13.598 {built-in method exec}
        1    0.000    0.000    0.000    0.000 {built-in method hasattr}
  4300456    4.726    0.000    4.726    0.000 {built-in method print}
   196806    0.312    0.000    0.312    0.000 {built-in method utf_8_decode}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
  4300456    3.489    0.000    3.489    0.000 {method 'split' of 'str' objects}

$ zcat access.log.gz | python2 -m cProfile ./ua.py | tail -10
   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    6.573    6.573 ua.py:3(<module>)
        1    3.894    3.894    6.573    6.573 ua.py:6(main)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
  4300456    2.680    0.000    2.680    0.000 {method 'split' of 'str' objects}

如何避免这种开销?与UTF-8有关吗?

马丁·彼得斯(Martijn Pieters)

Python 3解码读取的数据stdin并再次编码为stdoutprint()在这里,与其说是unicode到字节的转换,倒不如说是功能要慢,反之亦然。

在您的情况下,您可能想绕过此方法而只处理字节;您可以BufferedIOBase通过.buffer属性访问基础实现

from sys import stdin, stdout

try:
    bytes_stdin, bytes_stdout = stdin.buffer, stdout.buffer
except AttributeError:
    bytes_stdin, bytes_stdout = stdin, stdout

def main():
    for line in bytes_stdin:
        try:
            fields = line.split(b'"', 6)
            bytes_stdout.write(fields[5] + b'\n')
        except IndexError:
            pass

if __name__ == '__main__':
    main()

现在,您必须使用stdout.write()print()上写入坚持stdout TextIOBase执行。

请注意,.split()现在使用的是字节字面量b'"',我们也编写了字节字面量b'\n'(通常由by照顾print())。

以上与Python 2.6及更高版本兼容。Python 2.5不支持该b前缀。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在Python 3.3中打印速度如此之慢,我该如何解决?

来自分类Dev

为什么使用 boto3 遍历分页器返回的页面如此之慢?

来自分类Dev

我该如何解决无法ImportError:无法在python3中导入名称

来自分类Dev

为什么在MongoDB中对索引项进行“区别”和“计数”命令的速度如此之慢?

来自分类Dev

Python:为什么 Python TCP 客户端在不同的 PC 上接收数据的速度如此之慢?

来自分类Dev

为什么这个python代码给出[3,3]?

来自分类Dev

为什么从Oracle外部表返回数据的速度如此之慢?

来自分类Dev

为什么与MongoDB,Redis和MySql相比Apache Cassandra的写入速度如此之慢

来自分类Dev

为什么在索引的Parquet文件上计算形状的速度如此之慢?

来自分类Dev

为什么从Canonical Partners资源库下载速度如此之慢?

来自分类Dev

为什么Apache Cassandra的写入速度与MongoDB,Redis和MySql相比如此之慢

来自分类Dev

为什么 Nautilus 将文件复制到 Google Drive 的速度如此之慢?

来自分类Dev

为什么我使用python3遇到分段错误?

来自分类Dev

为什么我的python脚本执行了3次?

来自分类Dev

为什么我的框架不能打包 python3 tkinter

来自分类Dev

为什么我的 Python 3 代码不起作用?

来自分类Dev

我该如何解决“无法加载插件“外部工具”。发生错误:在GEdit中找不到插件加载器“ python 3”)的错误?

来自分类Dev

我该如何解决“无法加载插件“外部工具”。发生错误:在GEdit中找不到插件加载器“ python 3”)的错误?

来自分类Dev

为什么相对导入在Python 3中不起作用?

来自分类Dev

为什么相对导入在Python 3中不起作用?

来自分类Dev

为什么在python 3类的实例中,对列表的更改是全局的?

来自分类Dev

计算繁重的线程在Python 3中“挂起”-为什么?

来自分类Dev

为什么Spark从S3读取和写入如此之快

来自分类Dev

Python:为什么不(a,b,c)=(* x,3)

来自分类Dev

Python 2/3:为什么type(Foo .__ init__)不同?

来自分类Dev

Python3:为什么__spec__起作用?

来自分类Dev

为什么“范围为(1000000000000000(1000000000000001))”?Python 3这么快?

来自分类Dev

为什么Ubuntu使用Python 2.6而不是3.X?

来自分类Dev

Python:为什么不(a,b,c)=(* x,3)

Related 相关文章

  1. 1

    为什么在Python 3.3中打印速度如此之慢,我该如何解决?

  2. 2

    为什么使用 boto3 遍历分页器返回的页面如此之慢?

  3. 3

    我该如何解决无法ImportError:无法在python3中导入名称

  4. 4

    为什么在MongoDB中对索引项进行“区别”和“计数”命令的速度如此之慢?

  5. 5

    Python:为什么 Python TCP 客户端在不同的 PC 上接收数据的速度如此之慢?

  6. 6

    为什么这个python代码给出[3,3]?

  7. 7

    为什么从Oracle外部表返回数据的速度如此之慢?

  8. 8

    为什么与MongoDB,Redis和MySql相比Apache Cassandra的写入速度如此之慢

  9. 9

    为什么在索引的Parquet文件上计算形状的速度如此之慢?

  10. 10

    为什么从Canonical Partners资源库下载速度如此之慢?

  11. 11

    为什么Apache Cassandra的写入速度与MongoDB,Redis和MySql相比如此之慢

  12. 12

    为什么 Nautilus 将文件复制到 Google Drive 的速度如此之慢?

  13. 13

    为什么我使用python3遇到分段错误?

  14. 14

    为什么我的python脚本执行了3次?

  15. 15

    为什么我的框架不能打包 python3 tkinter

  16. 16

    为什么我的 Python 3 代码不起作用?

  17. 17

    我该如何解决“无法加载插件“外部工具”。发生错误:在GEdit中找不到插件加载器“ python 3”)的错误?

  18. 18

    我该如何解决“无法加载插件“外部工具”。发生错误:在GEdit中找不到插件加载器“ python 3”)的错误?

  19. 19

    为什么相对导入在Python 3中不起作用?

  20. 20

    为什么相对导入在Python 3中不起作用?

  21. 21

    为什么在python 3类的实例中,对列表的更改是全局的?

  22. 22

    计算繁重的线程在Python 3中“挂起”-为什么?

  23. 23

    为什么Spark从S3读取和写入如此之快

  24. 24

    Python:为什么不(a,b,c)=(* x,3)

  25. 25

    Python 2/3:为什么type(Foo .__ init__)不同?

  26. 26

    Python3:为什么__spec__起作用?

  27. 27

    为什么“范围为(1000000000000000(1000000000000001))”?Python 3这么快?

  28. 28

    为什么Ubuntu使用Python 2.6而不是3.X?

  29. 29

    Python:为什么不(a,b,c)=(* x,3)

热门标签

归档