標籤:

為什麼C++讀取文件會比Python慢?

問題是這樣的,我有一個文件夾大概有10萬行數據,然後用C++和Python分別其數出有多少行數據是符合要求的。因為不知道什麼原因,C++和Python總是只能數出其中的七千多行就結束了,然後我就用了文件指針定位來解決了這個問題,然後C++和Python寫的兩個程序都能正常運行和計算了。但是我發現C++運行出結果需要29秒,而Python只需要7秒。為什麼會這樣

PS:C++我用的是getline函數,而Python我用的是readlines函數。

另外有個問題就是在另一個每一行不等長的文件中,C++的指針定位為什麼總是不像Python一樣能夠精準定位到文件尾,文件指針和getline函數搭配怎麼使用。。。?求大神求大神。。。哭求。。。


因為 C++ 有「兼容 C」的歷史包袱在。

默認情況下 std::cin 每次操作後都要和 stdin 的緩衝區做同步,以便 iostream 和 stdio 混用。關掉這一行為即可大幅提升性能:

std::ios_base::sync_with_stdio(false);


就算是劉翔跑一步停一下,再跑一步再停一下,也沒我連著跑一萬米快…樓主你信還是不信


我覺得跟getline比較的應該是Python的readline函數,而不是readlines函數。


在優化大致相當的情況下,無非就是時間和空間的相互妥協。getline每次返回一行,也只用一行的內存。而readlines一次讀取10萬行,然後一行行給你。C++多花的時間是為他少花的內存付出的代價而已。


你的問題我也遇到過,很簡單,python是一次性讀取,而C++是一行一行讀的,所以這樣比較並不公平。自己寫一個函數,讓C++也一次性讀取,再比較。

string readfile(char* filename)
{
char *tmp;
string s;
FILE *fp = fopen(filename , "rb");
if (fp!=NULL)
{
fseek( fp , 0 , SEEK_END );
int file_size = ftell( fp );
rewind(fp);
tmp = new char[file_size];
fread( tmp, sizeof(char), file_size , fp);
fclose(fp);
s = string(tmp);
delete[]tmp;
}
else
{
cout &<&< "file open failed! " &<&< filename &<&


學習了


推薦閱讀:

Python3 str在內存中的存儲方式?
自己寫的Python函數,如何調用?
OSX 10.9.4 如何安裝 Python 2.7?
python 3.4 新加入的asyncio是咋通過yield from實現非同步的?
如何看待 Instagram 將所有 Web 後端遷移到 Python 3.6 ?

TAG:Python | C | VisualC |