增加C++正则表达式取代性能

use*_*263 11 c++ python regex performance replace

我是一名初学C++程序员,从事一个小型C++项目,我必须处理一些相对较大的XML文件,并从中删除XML标签.我使用C++ 0x regex库成功完成了这项工作.但是,我遇到了一些性能问题.只需读入文件并在其内容上执行regex_replace函数,我的电脑上大约需要6秒钟.我可以通过添加一些编译器优化标志将其降低到2.但是,使用Python,我可以在不到100毫秒的时间内完成它.显然,我在C++代码中做的事情非常低效.我该怎么做才能加快速度呢?

我的C++代码:

std::regex xml_tags_regex("<[^>]*>");

for (std::vector<std::string>::iterator it = _files.begin(); it != 
        _files.end(); it++) {

    std::ifstream file(*it);
    file.seekg(0, std::ios::end);
    size_t size = file.tellg();

    std::string buffer(size, ' ');

    file.seekg(0);
    file.read(&buffer[0], size);

    buffer = regex_replace(buffer, xml_tags_regex, "");

    file.close();
}
Run Code Online (Sandbox Code Playgroud)

我的Python代码:

regex = re.compile('<[^>]*>')

for filename in filenames:
    with open(filename) as f:
        content = f.read()
        content = regex.sub('', content)
Run Code Online (Sandbox Code Playgroud)

PS我真的不关心一次处理完整的文件.我刚刚发现逐行,逐字或逐个字符地读取文件会大大减慢速度.

hex*_*ist 2

我认为你没有做任何“错误”的事情,C++ 正则表达式库只是没有 python 库那么快(至少对于目前的这个用例来说)。这并不奇怪,请记住,Python 正则表达式代码的底层也是 C/C++,并且多年来经过调整,速度相当快,因为​​这是 Python 中相当重要的功能,所以自然而然地,它会继续下去。相当快。

但如果您需要,C++ 中还有其他选项可以让事情变得更快。我过去使用过 PCRE ( http://pcre.org/ ),取得了很好的效果,不过我确信现在还有其他好的方法。

然而,特别是对于这种情况,您也可以在没有正则表达式的情况下实现您所追求的目标,在我的快速测试中,这产生了 10 倍的性能改进。例如,以下代码扫描您的输入字符串,将所有内容复制到新缓冲区,当它命中 a 时,<它开始跳过字符,直到看到结束符>

std::string buffer(size, ' ');
std::string outbuffer(size, ' ');

... read in buffer from your file

size_t outbuffer_len = 0;
for (size_t i=0; i < buffer.size(); ++i) {
    if (buffer[i] == '<') {
        while (buffer[i] != '>' && i < buffer.size()) {
            ++i;
        }
    } else {
        outbuffer[outbuffer_len] = buffer[i];
        ++outbuffer_len;
    }
}
outbuffer.resize(outbuffer_len);
Run Code Online (Sandbox Code Playgroud)