天天看點

為什麼c比python快_為什麼在C ++中從stdin讀取行比Python慢​​得多?

我想比較使用Python和C ++從stdin讀取的字元串輸入的行數,并且震驚地看到我的C ++代碼比等效的Python代碼慢一個數量級。由于我的C ++生鏽,并且我還不是專家Pythonista,是以請告訴我我做錯了什麼還是誤解了什麼。

(TLDR答案:包括以下聲明:cin.sync_with_stdio(false)或僅使用fgets代替。

TLDR結果:一直滾動到我的問題的底部,然後檢視表格。)

C ++代碼:

#include

#include

using namespace std;

int main() {

string input_line;

long line_count = 0;

time_t start = time(NULL);

int sec;

int lps;

while (cin) {

getline(cin, input_line);

if (!cin.eof())

line_count++;

};

sec = (int) time(NULL) - start;

cerr << "Read " << line_count << " lines in " << sec << " seconds.";

if (sec > 0) {

lps = line_count / sec;

cerr << " LPS: " << lps << endl;

} else

cerr << endl;

return 0;

}

// Compiled with:

// g++ -O3 -o readline_test_cpp foo.cpp

等同于Python:

#!/usr/bin/env python

import time

import sys

count = 0

start = time.time()

for line in sys.stdin:

count += 1

delta_sec = int(time.time() - start_time)

if delta_sec >= 0:

lines_per_sec = int(round(count/delta_sec))

print("Read {0} lines in {1} seconds. LPS: {2}".format(count, delta_sec,

lines_per_sec))

這是我的結果:

$ cat test_lines | ./readline_test_cpp

Read 5570000 lines in 9 seconds. LPS: 618889

$cat test_lines | ./readline_test.py

Read 5570000 lines in 1 seconds. LPS: 5570000

我應該注意,我在Mac OS X v10.6.8(Snow Leopard)和Linux 2.6.32(Red Hat Linux 6.2)下都嘗試過。前者是MacBook Pro,後者是非常強大的伺服器,并不是說這太相關了。

$ for i in {1..5}; do echo "Test run $i at `date`"; echo -n "CPP:"; cat test_lines | ./readline_test_cpp ; echo -n "Python:"; cat test_lines | ./readline_test.py ; done

Test run 1 at Mon Feb 20 21:29:28 EST 2012

CPP: Read 5570001 lines in 9 seconds. LPS: 618889

Python:Read 5570000 lines in 1 seconds. LPS: 5570000

Test run 2 at Mon Feb 20 21:29:39 EST 2012

CPP: Read 5570001 lines in 9 seconds. LPS: 618889

Python:Read 5570000 lines in 1 seconds. LPS: 5570000

Test run 3 at Mon Feb 20 21:29:50 EST 2012

CPP: Read 5570001 lines in 9 seconds. LPS: 618889

Python:Read 5570000 lines in 1 seconds. LPS: 5570000

Test run 4 at Mon Feb 20 21:30:01 EST 2012

CPP: Read 5570001 lines in 9 seconds. LPS: 618889

Python:Read 5570000 lines in 1 seconds. LPS: 5570000

Test run 5 at Mon Feb 20 21:30:11 EST 2012

CPP: Read 5570001 lines in 10 seconds. LPS: 557000

Python:Read 5570000 lines in 1 seconds. LPS: 5570000

微小的基準附錄和總結

為了完整起見,我認為我将使用原始(已同步)C ++代碼更新同一框上同一檔案的讀取速度。同樣,這是針對快速磁盤上的100M行檔案。這是比較,有幾種解決方案/方法:

Implementation Lines per second

python (default) 3,571,428

cin (default/naive) 819,672

cin (no sync) 12,500,000

fgets 14,285,714

wc (not fair comparison) 54,644,808