为什么 C 标准输入读取效率低于 Python
比较 Python 和 C 从标准读取字符串输入行的性能输入(stdin)时,出现了显着的差异:C 代码的运行速度显着变慢。这促使我们调查造成这种性能差距的根本原因。
问题源于 C 的默认设置。默认情况下,istream(例如 cin)与 stdio 同步,从而避免输入缓冲。为了优化性能,可以使用 std::ios_base::sync_with_stdio(false) 语句禁用此同步。此调整缓解了主要的性能限制。
标准输入流在 Python 和 C 之间的设计上运行方式不同。 Python 通常是有缓冲的,而 C 的默认情况下是无缓冲的。一般情况下,缓冲减少了系统调用,提高了效率。然而,C 中基于 FILE* 的 stdio 和 iostream 的单独实现和缓冲区在一起使用时会带来潜在问题。
为了避免缓冲区不一致和意外结果,C 默认情况下将流与 stdio 同步。虽然这可以防止潜在的问题,但它会带来开销,特别是在处理大量输入时。
为了实现最大性能,程序员可以使用sync_with_stdio方法禁用同步。此优化允许 C 标准流独立缓冲,在某些场景下显着提高速度。
性能基准
为了更全面的比较,这里有各种方法的性能基准:
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 | 54,644,808 | (Not a fair comparison) |
显然,禁用同步并使用 fget 会显着提高 C 语言的性能.
以上是为什么 C 标准输入读取速度比 Python 慢,如何改进?的详细内容。更多信息请关注PHP中文网其他相关文章!