在python中优化大文件上的正则表达式和文件读取操作

在python中优化大文件上的正则表达式和文件读取操作,python,regex,optimization,profile,Python,Regex,Optimization,Profile,现在我有两个大文件,模式文件和日志文件,每个文件都有超过300000行。模式文件的格式如下: Line 1 : <ID> <Dialog1> <ReplyStr> <Dialog2> // the ReplyStr is needed as a pattern Line 1 : <LogData> <ReplyStr> <CommentOfReply> // get a

现在我有两个大文件,模式文件日志文件,每个文件都有超过300000行。模式文件的格式如下:

Line 1 : <ID>   <Dialog1>    <ReplyStr>    <Dialog2>    
// the ReplyStr is needed as a pattern
Line 1 : <LogData>    <ReplyStr>    <CommentOfReply>   
// get all CommentOfReply, whose ReplyStr is from the pattern file

从配置文件来看,似乎所有的时间都来自
re.search()
。我不知道如何减少它。

多亏了@MikeSatteson和@tobias_k的帮助,我才明白了这一点

要挑出与给定回复字符串(从模式文件)对应的所有注释字符串(从日志文件),解决方案是:

  • 需要一个dict,其键是reply string,其值是注释字符串的列表
  • 模式文件中选择所有回复字符串作为dict的键集
  • 日志文件中选择所有回复注释对,如果dict的密钥集包含回复,则将注释附加到注释列表中
  • 代码如下:

    my_dict = {}
    with open('pattern file', 'r') as pattern_file:
        for line in pattern_file:
            reply = get_reply(line)
            my_dict[reply] = list()     
    
    with open('log file', 'r') as log_file:
        for line in log_file:
            pair = get_comment_reply_pair(line)
            reply = pair.reply
            comment  = pair.comment
            if reply in my_dict:
                l = my_dict[reply]
                l.append(comment)
    

    那么您正试图在300000行上执行类似300000次单独搜索的操作?这听起来像是10^11左右的操作,这确实需要很长时间。也许你需要重新思考你想要实现的目标。但如果你把它具体化一点,它可能会成为一个有趣的问题。您能否与我们分享更多关于要搜索的特定模式和文本的信息?为什么你需要这么多图案?这个项目的总体目标是什么?你不能只迭代一次日志文件,然后创建一个大字典
    {replyStr:[CommentOfReply,…]}
    ?然后迭代模式文件,并立即获取所有回复的注释。@stanleyerror如果您提供两个文件的一个小的代表性摘录(可能有十行),那么如果需要,我可能会编写一些示例代码来帮助您入门。@tobias_k haha,谢谢您。嗯,我应该独立完成,因为这是我的任务。无论如何,你的解决方案帮助很大。你想自己完成的愿望令人钦佩。别忘了,一旦你找到了解决方案,如果你愿意,你可以回答自己的问题。很高兴看到你找到了答案!两个小建议:你可以使用
    和open('pattern file')作为pattern\u file:
    自动关闭文件,如果在my\u dict中回复,你只需执行
    。干得好@stanleyerror!我很高兴你觉得我的评论很有帮助。@tobias_k我已经用你的建议改进了答案。
    with open()是否作为一个缓冲读取器,我的意思是在需要时将行加载到内存?@stanleyerror,这与您是否使用
    with
    无关。如果对模式文件中的行使用
    ,文件将逐行读取,而如果使用
    lines=pattern\u file.readlines()
    ,则一次读取整个文件。
    使用
    所做的只是确保文件已关闭,即使出现某种错误。有关使用
    的详细信息,请参阅。
    
    my_dict = {}
    with open('pattern file', 'r') as pattern_file:
        for line in pattern_file:
            reply = get_reply(line)
            my_dict[reply] = list()     
    
    with open('log file', 'r') as log_file:
        for line in log_file:
            pair = get_comment_reply_pair(line)
            reply = pair.reply
            comment  = pair.comment
            if reply in my_dict:
                l = my_dict[reply]
                l.append(comment)