मैं पाइथन और सी ++ का उपयोग करके स्टड से स्ट्रिंग इनपुट की रीडिंग लाइनों की तुलना करना चाहता था और मेरे सी ++ कोड को बराबर पायथन कोड की तुलना में परिमाण धीमी करने के क्रम को देखकर हैरान था। चूँकि मेरा C ++ रस्टी है और मैं अभी तक एक विशेषज्ञ पाइथोनिस्टा नहीं हूं, कृपया मुझे बताएं कि क्या मैं कुछ गलत कर रहा हूं या यदि मैं कुछ गलत कर रहा हूं।
(TLDR उत्तर: कथन को शामिल करें: cin.sync_with_stdio(false)
या fgets
इसके बजाय केवल उपयोग करें ।
TLDR परिणाम: मेरे सवाल के नीचे तक सभी तरह से स्क्रॉल करें और तालिका देखें।)
C ++ कोड:
#include <iostream>
#include <time.h>
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
पायथन समतुल्य:
#!/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
मुझे ध्यान देना चाहिए कि मैंने मैक ओएस एक्स v10.6.8 (स्नो लेपर्ड) और लिनक्स 2.6.32 (रेड हैट लिनक्स 6.2) के तहत यह कोशिश की। पूर्व एक मैकबुक प्रो है, और बाद वाला एक बहुत ही मांसल सर्वर है, ऐसा नहीं है कि यह बहुत प्रासंगिक है।
$ 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
<iostream>
प्रदर्शन बेकार है। पहली बार ऐसा नहीं हुआ। 2) अजगर लूप में डेटा को कॉपी न करने के लिए पर्याप्त चतुर है क्योंकि आप इसका उपयोग नहीं करते हैं। आप का उपयोग करने की कोशिश कर retest scanf
और एक कर सकते हैं char[]
। वैकल्पिक रूप से आप लूप को फिर से लिखने की कोशिश कर सकते हैं ताकि स्ट्रिंग के साथ कुछ किया जा सके (जैसे कि 5 वें अक्षर को रखें और परिणाम में इसे संक्षिप्त करें)।
cin.eof()
!! रखो getline
'if` बयान में कॉल।