為什麼在 C 中從 stdin 讀取行比 Python 慢得多?
在 C 中從標準輸入 (stdin) 讀取行可能會慢得多C 與 Python 相比,由於 C 輸入流中的預設設定不同。
預設緩衝
預設情況下,C 輸入流 (cin) 與標準輸入/輸出 (stdio) 串流同步。這種同步會強制 cin 避免任何輸入緩衝,從而導致一次讀取一個字元。
Python 緩衝
相較之下,stdin 流Python 中預設是緩衝的,這使得它可以一次讀取更大的輸入區塊。這減少了讀取資料所需的系統呼叫數量,從而提高了效能。
修復C 程式碼
要在C 中實現類似的效能,您可以停用透過在主函數的開頭添加以下行來與stdio 同步:
std::ios_base::sync_with_stdio(false);
這允許cin緩衝其輸入並顯著改進
fgets 與getline
此外,您可以考慮使用fgets 代替getline(),這是一個讀取一行文字的C 函數來自文件或標準輸入。 fgets 的優點是不需要動態分配內存,進一步提高了效能。
效能比較
下表是不同方法的每秒行數(LPS)比較使用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 |
如您所見,禁用同步或顯著使用fgets提高了C 的效能。
以上是為什麼 C 的 stdin 輸入明顯慢於 Python,如何改進?的詳細內容。更多資訊請關注PHP中文網其他相關文章!