目录
为什么在 C 语言中从 stdin 读取行明显比 Python 慢?
C 代码
C Streams 的默认设置
性能改进
替代方案:使用 fgets
基准测试结果
结论
首页 后端开发 Python教程 为什么 C 的 stdin 行读取速度明显慢于 Python,如何改进?

为什么 C 的 stdin 行读取速度明显慢于 Python,如何改进?

Nov 25, 2024 am 03:17 AM

Why Is C  's `stdin` Line Reading Significantly Slower Than Python's, and How Can It Be Improved?

为什么在 C 语言中从 stdin 读取行明显比 Python 慢?

在本文中,我们旨在研究为什么从标准输入(stdin)读取字符串数据行)使用 C 通常比 Python 慢得多。我们首先检查提供的代码,确定潜在的关注领域。

C 代码

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++;
}
登录后复制

此代码使用 getline() 读取文本行stdin 并计算文件中的行数。但是,它在内部循环中一次读取文件的每个字符。这种方法效率低下,会导致过多的系统调用,从而导致执行缓慢。

C Streams 的默认设置

与 Python 不同,C Streams 的默认设置优先与 C 风格标准同步输入和输出功能。这种同步可确保 C 和 C 流一致地访问输入和输出资源。然而,这种同步也会阻止 C 流使用更高效的缓冲机制。

cinstdio 同步,这会导致它避免任何输入缓冲。因此,cin 一次只能读取一个字符,使得该过程更加耗时。

性能改进

为了提高 C 代码的性能,我们可以禁用 cinstdio 之间的同步。通过在程序开头添加语句 cin.sync_with_stdio(false),我们可以允许 C 流独立缓冲其 I/O,从而显着提高速度。

替代方案:使用 fgets

另一个提高性能的有效方法是使用 fgets() 而不是getline()fgets 是一个 C 函数,它从 stdin 读取指定数量的字符到字符数组中,从而更好地控制缓冲过程。

基准测试结果

演示性能差异,使用包含 1 亿行的文件进行基准测试。使用原始(同步)C 代码、禁用同步的 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 a fair comparison) 54,644,808

在 C 中禁用同步带来了显着的改进,而使用 fgets 提供了更好的性能。需要注意的是,使用 wc 并不是一个公平的比较,因为它是专门为计数行而设计的。

结论

通过了解 C 流的默认设置并实现适当的优化,例如禁用流同步或使用 fgets,可以显着提高 C 代码从 stdin 读取行的性能,使其与 Python 对应物相当甚至更快。

以上是为什么 C 的 stdin 行读取速度明显慢于 Python,如何改进?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? 如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

在Linux终端中使用python --version命令时如何解决权限问题? 在Linux终端中使用python --version命令时如何解决权限问题? Apr 02, 2025 am 06:36 AM

Linux终端中使用python...

如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? 如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? Apr 02, 2025 am 07:18 AM

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

如何绕过Investing.com的反爬虫机制获取新闻数据? 如何绕过Investing.com的反爬虫机制获取新闻数据? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...

Python 3.6加载pickle文件报错ModuleNotFoundError: No module named '__builtin__'怎么办? Python 3.6加载pickle文件报错ModuleNotFoundError: No module named '__builtin__'怎么办? Apr 02, 2025 am 06:27 AM

Python3.6环境下加载pickle文件报错:ModuleNotFoundError:Nomodulenamed...

使用Scapy爬虫时,管道文件无法写入的原因是什么? 使用Scapy爬虫时,管道文件无法写入的原因是什么? Apr 02, 2025 am 06:45 AM

使用Scapy爬虫时管道文件无法写入的原因探讨在学习和使用Scapy爬虫进行数据持久化存储时,可能会遇到管道文�...

See all articles