আমি পাইথন এবং সি ++ ব্যবহার করে স্টিডিনের স্ট্রিং ইনপুটগুলির পড়ার রেখাগুলির তুলনা করতে চেয়েছিলাম এবং আমার সি ++ কোডটি সমতুল্য পাইথন কোডের চেয়ে ধীরে ধীরে প্রস্থের ক্রমটি চালানো দেখে হতবাক হয়েছিল। যেহেতু আমার সি ++ টি জঞ্জাল এবং আমি এখনও পাইথনিস্টা বিশেষজ্ঞ নই, দয়া করে আমাকে বলুন যে আমি কিছু ভুল করছি বা আমি কিছু ভুল বুঝছি।
(টিএলডিআর উত্তর: বিবৃতিটি অন্তর্ভুক্ত করুন: cin.sync_with_stdio(false)
বা fgets
পরিবর্তে কেবল ব্যবহার করুন।
টিএলডিআর ফলাফল: আমার প্রশ্নের নীচে সমস্ত দিকে স্ক্রোল করুন এবং টেবিলটি দেখুন))
সি ++ কোড:
#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 (স্নো চিতা) এবং লিনাক্স ২.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
ক্ষুদ্র বেঞ্চমার্ক সংযোজন এবং পুনর্নির্মাণ
সম্পূর্ণতার জন্য, আমি ভেবেছিলাম যে আমি একই বক্সে একই ফাইলের পড়ার গতিটি মূল (সিঙ্ক করা) সি ++ কোড সহ আপডেট করব। আবার এটি একটি দ্রুত ডিস্কে 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) পাইথন লুপের জন্য ডেটা অনুলিপি না করার জন্য যথেষ্ট চালাক কারণ আপনি এটি ব্যবহার করেন না। আপনি ব্যবহার করার চেষ্টা করে পরীক্ষা করতে পারেন scanf
এবং একটি char[]
। বিকল্পভাবে আপনি লুপটি পুনরায় লেখার চেষ্টা করতে পারেন যাতে স্ট্রিং দিয়ে কিছু করা হয় (উদাহরণস্বরূপ 5 তম অক্ষরটি রাখুন এবং ফলস্বরূপ এটিকে সংলগ্ন করুন)।
cin.eof()
বলে মনে হচ্ছে: এর বিরুদ্ধে পরীক্ষা দিবেন না !! getline
'If`' স্টেটমেন্টে কলটি রাখুন ।