为什么在 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中文网其他相关文章!