代码之家  ›  专栏  ›  技术社区  ›  Kyle Brandt

Python datetime.strptime()占用大量CPU时间

  •  9
  • Kyle Brandt  · 技术社区  · 14 年前

    01/Nov/2010:07:49:33 .

    new_entry['time'] = datetime.strptime(
            parsed_line['day'] +
            parsed_line['month'] +
            parsed_line['year'] +
            parsed_line['hour'] +
            parsed_line['minute'] +
            parsed_line['second']
            , "%d%b%Y%H%M%S"
    )
    

    有人知道我该怎么优化吗?

    4 回复  |  直到 14 年前
        1
  •  16
  •   Community CDub    7 年前

    如果这些是固定宽度的格式,那么就不需要解析行-您可以使用切片和字典查找来直接获取字段。

    month_abbreviations = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4,
                           'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8,
                           'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
    year = int(line[7:11])
    month = month_abbreviations[line[3:6]]
    day = int(line[0:2])
    hour = int(line[12:14])
    minute = int(line[15:17])
    second = int(line[18:20])
    new_entry['time'] = datetime.datetime(year, month, day, hour, minute, second)
    

    测试方式如下 Glenn Maynard

        2
  •  3
  •   Andrew Miller    13 年前

    在Windows平台上使用strptime()似乎使用了一个Python实现(Lib目录中的strptime.py)。不是C级的。你自己处理绳子可能更快。

    from datetime import datetime
    import timeit
    
    def f():
        datetime.strptime ("2010-11-01", "%Y-%m-%d")
    
    n = 100000
    print "%.6f" % (timeit.timeit(f, number=n)/n)
    

    在我的系统上返回0.000049,而

    from datetime import date
    import timeit
    
    def f():
        parts = [int (x) for x in "2010-11-01".split ("-")]
        return date (parts[0], parts[1], parts[2])    
    
    n = 100000
    print "%.6f" % (timeit.timeit(f, number=n)/n)
    

    返回0.000009

        3
  •  2
  •   Glenn Maynard    14 年前

    什么是“很多时间”? strptime

    from datetime import datetime
    import timeit
    def f():
        datetime.strptime("01/Nov/2010:07:49:33", "%d/%b/%Y:%H:%M:%S")
    n = 100000
    print "%.6f" % (timeit.timeit(f, number=n)/n)
    

    打印0.000031。

        4
  •  2
  •   Brandon Rhodes    14 年前

    最新答案: strptime() 并没有改善运行时间,那么我的怀疑是这里实际上没有问题:您只是编写了一个程序,它的主要目的之一就是调用 strTime() 很多次,你都写得很好,只写了那么一点点其他的东西 允许调用控制运行时是非常正确的。我认为你可以把它看作是成功而不是失败,除非你发现(a)某个Unicode或LANG设置正在 strTime() 做额外的工作,或者(b)你打电话给它的次数比你需要的要多。当然,尝试对要解析的每个日期只调用一次。:-)

    在看到示例日期字符串后,继续回答: 等待!等等!为什么要解析行而不是使用格式字符串,如:

    "%d/%b/%Y:%H:%M:%S"
    

    :如果月份是整数,则可以执行以下操作:

    new_entry['time'] = datetime.datetime(
        int(parsed_line['year']),
        int(parsed_line['month']),
        int(parsed_line['day']),
        int(parsed_line['hour']),
        int(parsed_line['minute']),
        int(parsed_line['second'])
    )
    

    避免创建一个大字符串 再把它分开。我想知道是否有一种方法可以直接访问月份名称逻辑来进行文本转换?