V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
snail1988
V2EX  ›  问与答

Python 3 的 open()函数比 Python 2 中的慢很多,有没有办法优化

  •  
  •   snail1988 · 2014-11-09 11:36:33 +08:00 · 6690 次点击
    这是一个创建于 3646 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Python 3中的open()应该是完全用Python实现的,速度和Python 2.5+ 中的io.open()相似,实现应该是相同的。
    我实测远比Python 2的open()慢很多,我的程序有大量io操作,有没有办法提高效率?
    大家有没有类似的问题?
    9 条回复    2014-11-09 19:00:03 +08:00
    ruoyu0088
        1
    ruoyu0088  
       2014-11-09 11:38:43 +08:00
    把你的测试代码和开发环境贴出来看看。什么系统,Python 3.x, python 2.x?
    snail1988
        2
    snail1988  
    OP
       2014-11-09 11:57:43 +08:00
    OSX 10.10/10.9.5 / Ubuntn 14.04 LTS
    Python 3.4.2/3.4 2.7.6/2.7.8

    代码片段
    def searchCrash(file):
    try:
    with open(file, 'r') as f:
    global count
    for line in f:
    if 'StackTrace' in line:
    count = count + 1
    except Exception as e:
    # raise e
    pass
    finally:
    pass


    def traverseFile(rootDir):
    for lists in os.listdir(rootDir):
    path = os.path.join(rootDir, lists)
    if os.path.isfile(path):
    searchCrash(path)


    我在一个2000个文件 总计4GB的目录上调用 traverseFile方法
    snail1988
        3
    snail1988  
    OP
       2014-11-09 11:59:03 +08:00
    @ruoyu0088 每个文件大约2-3M,纯文本UTF8编码
    imn1
        4
    imn1  
       2014-11-09 12:25:39 +08:00
    请给出2.x和3.x的cProfile对比

    1.如果每文件只有2~3M,我是不会逐行搜索,而是直接全文件搜索
    2.py而文件路径仅仅是个字符串,用字符串的join要比 os.path.join 快
    3.open指定encoding参数比较好,如果不纯粹是ASCII字符,你这段代码应该不少except
    4.searchCrash没有返回值,却用了global,不如把count返回,避免使用global
    ruoyu0088
        5
    ruoyu0088  
       2014-11-09 12:29:04 +08:00
    我记得Python3用"r"模式打开文件的话读入的是Unicode,有一个UTF8转Unicode的过程。
    snail1988
        6
    snail1988  
    OP
       2014-11-09 12:35:27 +08:00 via iPhone
    @imn1
    @ruoyu0088
    谢谢两位,我以前没接触过python开发,这次是有些log要分析,所以使用 python处理下数据,开始是在Mac自带的py2环境处理,后来想试试py3会不会更快,结果比较意外

    我这2000个文件一个异常也没有,我逐行搜索是因为我的log以行为单位,所以就用了read line,我试试全文搜索的效率
    lxyu
        7
    lxyu  
       2014-11-09 14:07:24 +08:00 via iPhone
    这种文件搜索为何不用 grep ack 这种工具呢?
    snail1988
        8
    snail1988  
    OP
       2014-11-09 14:21:55 +08:00
    @lxyu 我要对文件内容做处理在进行比对,然后做处理,之前用shell grep sed 这些做了个脚本,太慢了改成python快很多
    snail1988
        9
    snail1988  
    OP
       2014-11-09 19:00:03 +08:00
    看来Py3的IO确实是因为编码和处理变慢了,下面这篇文章不错
    http://dabeaz.blogspot.com/2010/01/reexamining-python-3-text-io.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1431 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:21 · PVG 01:21 · LAX 10:21 · JFK 13:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.