当比较使用 C 和 Python 从标准输入读取行的性能时,您可能会发现令人惊讶的是,C 代码的运行速度往往比 Python 代码慢得多。这可以归因于两种语言默认输入/输出 (I/O) 设置的根本差异。
默认情况下,C 输入流cin 与标准 I/O (stdio) 系统同步。这意味着 cin 避免任何输入缓冲并根据需要逐字符读取数据。虽然这种方法可以防止将 C I/O 流与 stdio 函数混合时出现潜在问题,但它会带来性能损失,尤其是在读取大量数据时。
相比之下,Python默认情况下使用缓冲输入。当从 Python 中的标准输入读取时,解释器会以更大的块读取输入,从而减少所需的系统调用数量。缓冲通过最小化与系统调用相关的开销来提高性能,并且可以显着加快输入处理速度。
要实现与 C 中的 Python 类似的性能,您可以显式禁用同步通过使用 ios_base::sync_with_stdio(false) 方法在 cin 和 stdio 之间进行切换。这允许 cin 独立缓冲输入,从而提高性能。
不要使用 getline(cin, input_line),而是考虑使用 fgets(input_line, sizeof(input_line) ,标准输入)直接。 fgets 是一个 C 函数,它从流中读取一行输入并将其存储在字符数组中。通过避免 cin 流,您可以进一步减少开销并可能提高性能。
提供的表格总结了 C 和 Python 中不同方法的行读取速度:
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 |
从结果中可以明显看出,默认的 C 实现的执行速度明显慢于 Python。但是,通过禁用流同步或直接使用 fgets,您可以在 C 中获得相当或更好的性能。
以上是为什么 C 行读取速度比 Python 慢,如何优化?的详细内容。更多信息请关注PHP中文网其他相关文章!