这种逐行文件读取在c ++中比在Python中慢得多?

时间:2018-01-07 16:05:30

标签: python c++ file fstream

我有一个2GB的文件。平均线有15个字符(最多50个)。使用时:

#include <iostream>
#include <fstream>
#include <string>

void main()
{
    std::ifstream input("myfile.txt");
    std::string line;
    while (std::getline(input, line))
    {
    }
    return;
}

需要大约320秒,而这个Python代码:

with open('myfile.txt', mode='r') as f:
    for l in f:
        semicolonpresent = ';' in l        # do anything here, not important

不到一分钟。

我使用的C ++版本有什么问题?

注意:我已经尝试了很多次,每次重新启动后,或者之前的许多次运行(因此它可能在I / O缓存中),但我总是得到这样的数量级。

注意2:我在Windows 7/64上编译了C ++代码,使用:

call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
cl main.cpp

3 个答案:

答案 0 :(得分:0)

void main不是有效的C ++。 return中的空main()都不是。while。此外,启用优化后,您的std::ifstream ifs(filename); auto end = ifs.tellg(); ifs.seekg(0, std::ios::beg); auto beg = ifs.tellg(); std::string buffer; buffer.reserve(end - beg); std::copy(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>(), buffer.begin()); 循环将被优化掉。随着那说......

如果启用优化,您应该会注意到速度的提升。但是,C ++中的流很慢。这对C ++世界来说不是新闻。那么为什么Python要快得多?这两者并不是真正相同的。 Python是用C语言编写的,内部委托给C库函数。此外,Python可能会提前分配缓冲区并一次性复制缓冲区。如果你想在C ++中做类似的事情:

{{1}}

答案 1 :(得分:0)

(部分)回答:

正如很多人在评论中提到的,cl optimization有所帮助:

cl /Ox helloworld1.cpp

将运行时间除以6!

答案 2 :(得分:0)

在我的测试中,C++并不比Python慢。在大型二进制文件中,它们大致相同。

我稍微修改了你的代码,以提供我觉得应该是准确的时间。

Python代码

import sys
import time 

start = time.time()
sum = 0
with open(sys.argv[1], mode='r') as f:
    for l in f:
        sum = sum + 1
end = time.time()

print "(", sum, ")", (end - start), "secs"

C ++代码

    auto start = std::chrono::steady_clock::now();

    std::ifstream ifs(argv[1]);
    std::string line;

    unsigned sum = 0;
    while(std::getline(ifs, line))
        ++sum;

    auto end = std::chrono::steady_clock::now();

    auto time = double(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count());

    OUT("( " << sum << " ) " << (time / 1000.0) << " secs");

处理7.1 GiB二进制视频文件会产生:

Python: ( 32547618 ) 62.9722070694 secs
C++   : ( 32547618 ) 63.368 secs

使用以下标志在C++上编译GCC v7.2代码:

g++ -std=c++17 -O3 ...

相比之下,未经优化的代码在68.541 secs

中运行