为什么在 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 流使用更高效的缓冲机制。
cin 与 stdio 同步,这会导致它避免任何输入缓冲。因此,cin 一次只能读取一个字符,使得该过程更加耗时。
性能改进
为了提高 C 代码的性能,我们可以禁用 cin 和 stdio 之间的同步。通过在程序开头添加语句 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中文网其他相关文章!

SlicingaPythonlistisdoneusingthesyntaxlist[start:stop:step].Here'showitworks:1)Startistheindexofthefirstelementtoinclude.2)Stopistheindexofthefirstelementtoexclude.3)Stepistheincrementbetweenelements.It'susefulforextractingportionsoflistsandcanuseneg

numpyallowsforvariousoperationsonArrays:1)basicarithmeticlikeaddition,减法,乘法和division; 2)evationAperationssuchasmatrixmultiplication; 3)element-wiseOperations wiseOperationswithOutexpliitloops; 4)

Arresinpython,尤其是Throughnumpyandpandas,weessentialFordataAnalysis,offeringSpeedAndeffied.1)NumpyArseNable efflaysenable efficefliceHandlingAtaSetSetSetSetSetSetSetSetSetSetSetsetSetSetSetSetsopplexoperationslikemovingaverages.2)

列表sandnumpyArraysInpyThonHavedIfferentMemoryfootprints:listSaremoreFlexibleButlessMemory-效率,而alenumpyArraySareSareOptimizedFornumericalData.1)listsStorReereReereReereReereFerenceStoObjects,withoverHeadeBheadaroundAroundaroundaround64bytaround64bitson64-bitsysysysyssyssyssyssyssyssysssys2)

toensurepythonscriptsbehavecorrectlyacrycrossdevelvermations,登台和生产,USETHESTERTATE:1)Environment varriablesforsimplesettings,2)configurationFilesForefilesForcomPlexSetups,3)dynamiCofforAdaptapity.eachmethodofferSuniquebeneiquebeneiquebeneniqueBenefitsaniqueBenefitsandrefitsandRequiresandRequireSandRequireSca

Python列表切片的基本语法是list[start:stop:step]。1.start是包含的第一个元素索引,2.stop是排除的第一个元素索引,3.step决定元素之间的步长。切片不仅用于提取数据,还可以修改和反转列表。

ListSoutPerformarRaysin:1)DynamicsizicsizingandFrequentInsertions/删除,2)储存的二聚体和3)MemoryFeliceFiceForceforseforsparsedata,butmayhaveslightperformancecostsinclentoperations。

toConvertapythonarraytoalist,usEthelist()constructororageneratorexpression.1)intimpthearraymoduleandcreateanArray.2)USELIST(ARR)或[XFORXINARR] to ConconverTittoalist,请考虑performorefformanceandmemoryfformanceandmemoryfformienceforlargedAtasetset。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器