Skip to content

搞英语 → 看世界

翻译英文优质信息和名人推特

Menu
  • 首页
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
  • Product Hunt
  • Visual Capitalist
  • Elon Musk
Menu

使用 std::views::split 更简单、更快地解析代码

Posted on 2024-12-22

无论您使用哪种编程语言,解析文本文件通常都会令人困惑。它也可能慢得令人惊讶。

例如,让我们考虑以下问题。您有一个逗号分隔值文件。它是一个由多行组成的文本文件,每行由逗号分隔为多个字段。 Excel 电子表格通常导出为逗号分隔值文件。您只想提取一列并对其进行迭代。

我向 ChatGPT 寻求 C++ 解决方案,它给了我以下代码:

 std :: vector < std :: string > get_column ( const std :: string & input , 
  
size_t row_number ,字符分隔符= ',' ) { 
  
std :: vector < std :: string >行; 
  
std :: istringstream iss (输入) ; 
  
std ::字符串行; 
  
 
  
// 将字符串分割成行 
  
while ( std :: getline ( iss ,行) ) { 
  
 行。推回(行) ; 
  
} 
  
 
  
std :: vector < std :: string >结果; 
  
for ( const auto & r :行) { 
  
std :: istringstream row_stream ( r ) ; 
  
std ::字符串字段; 
  
size_t索引= 0 ; 
  
 
  
while ( std :: getline ( row_stream ,字段,分隔符) ) { 
  
如果(索引==行号) { 
  
 结果。推回(字段) ; 
  
休息; 
  
} 
  
+ +索引; 
  
} 
  
} 
  
 
  
返回结果; 
  
} 
  

该函数采用表示类似 CSV 数据的字符串输入、列索引 row_number 和可选分隔符(默认为逗号)。它将输入字符串拆分为行,然后对于每一行,它根据分隔符进一步将行拆分为字段。它将每行中指定列索引处的字段收集到一个字符串向量中,然后返回该向量。

这是非常糟糕的代码。我不认为任何专业的 C++ 程序员会写出如此糟糕的代码。但话又说回来,我可能会感到惊讶。

如果您拥有使用 C++20 的现代系统,则可以使用std::views::split编写更少的代码并获得高性能。让我演示一下:

自动get_column_cxx20 ( std :: string_view 数据, 
  
size_t row_number ,字符分隔符= ',' ) { 
  
自动行=数据| std :: views :: split ( '\n' ) ; 
  
自动列= 
  
 行| 
  
std ::视图::变换( 
  
[分隔符,行号] (自动&&行) { 
  
自动字段=行| std :: views :: split (分隔符) ; 
  
auto it = std :: ranges :: begin (字段) ; 
  
std :: Advance ( it , row_number ) ; 
  
返回*它; 
  
} ) | 
  
std :: views :: transform ( [ ] ( auto && rng ) - > std :: string_view { 
  
返回std :: string_view ( & * rng . begin ( ) , 
  
std ::范围::距离( rng ) ) ; 
  
} ) ; 
  
返回栏; 
  
}

该函数使用 C++20 的范围和视图从表示为std::string_view 的类 CSV 数据中提取特定列。它首先使用换行符将输入数据拆分为行,然后应用一系列转换:根据分隔符将每行拆分为字段,选择指定列索引 (row_number) 处的字段,最后将这些选定的字段转换回std::string_view 对象。这种方法具有内存效率高的特点,因为它避免了复制数据,使用惰性求值仅在必要时处理数据。

我编写了一个小型基准测试,其中使用现有的 CSV 文件,要求提供第二列,然后将该列的宽度相加。使用 LLVM 16 和 Apple M2 处理器,我得到以下结果:

老派 0.11GB/秒
std::视图::分割 2.6GB/秒

重要的是,没有磁盘访问。一切都在记忆中。因此,老式方法的计算速度纯粹受限于微不足道的 0.11 GB/s。我的源代码可以在 GitHub 上找到。

我没有尝试调整std::views::split方法。我怀疑我们可以通过进一步调整来获得更多性能。但它已经比简单的方法快了 20 倍。

字符串上的应用程序 std::views::split 的主要烦恼是它可以自然地处理范围和子范围,而我更喜欢使用std::string_view实例。因此,我们看到代码中包含了一个丑陋的转换例程。我还没有找到简化这部分代码的方法。

原文: https://lemire.me/blog/2024/12/21/simpler-and-faster-parsing-code-with-stdviewssplit/

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abdisalan Mohamud
  • Addy Osmani
  • Aeon
  • Ahoy There! on THT's den
  • Alec Muffett
  • Andreas
  • anhvn
  • Ankaph
  • Annie
  • Armin Ronacher
  • Ask Hacker News Weekly
  • Astro Blog
  • Austin White
  • Backlinko
  • Better Dev Link
  • Building Pika Out Loud
  • Caleb Hearth
  • Cédric Aellen
  • Chip Huyen
  • Colossal
  • Cooltools by KK
  • CoRecursive
  • Craig Mod
  • Curt Merrill
  • Dan Abramov's Overreacted Blog RSS Feed
  • Daniel Lemire
  • Daniel Stenberg
  • Daring Fireball
  • David H
  • David Heinemeier Hansson
  • Dayu | 大宇
  • Ed Zitron
  • Ersei
  • Ersei 'n Stuff
  • Evan Martin
  • First Page Sage
  • Founder Weekly
  • FuzzyGrim
  • Gabriel
  • Good Enough
  • Gregory Hammond
  • Habib
  • How They Make Money
  • I Love Charts
  • Ian Betteridge
  • Ivaylo Durmonski
  • Jason Kottke
  • Jason Kratz
  • Jeff Perry
  • John D. Cook
  • Jonas Hietala
  • Jonathan Snook
  • jwb
  • Kevin Kelly
  • Kevin Yank
  • Kirsty
  • Kush
  • Loris Cro
  • Maarten van Gompel
  • Manas J. Saloi
  • Mandy Brown
  • Matt Fantinel
  • Matt Mullenweg
  • Mere Civilian
  • Ness Labs
  • News Letter
  • Nicholas Carlini
  • Nicolas F. R. A. Prado
  • Niko
  • Nir Eyal
  • Noah Smith
  • Pedro Lopes
  • Positive News
  • Predrag Gruevski
  • Rachel Kroll
  • Recomendo by KK
  • rendezvous with cassidoo
  • Rest of World
  • Ruben Schade
  • Scott Galloway
  • Sébastien Etter
  • SEMrush Blog
  • Seth Godin
  • Shariq Raza Qadri
  • Simon Willison
  • Six Colors
  • Slashdot
  • Spectre Collie
  • Spyglass
  • storytelling with data
  • Streamline Blog
  • Tableau Blog
  • tekphloyd
  • The Alchemy of Money
  • The Independent Variable
  • The Marginalian
  • thriftmac
  • Tim Bray
  • Tim Ferriss
  • Tim Kellogg
  • TLDR
  • Topslakr
  • Track Awesome list
  • Trump
  • Victor Kropp
  • Vincent Ritter
  • Vox
  • Westenberg
  • Xe Iaso
  • xkcd
  • Yuri Cunha
  • Zarar
  • 未分类
  • 英文媒体
  • 英文推特
  • 英文独立博客
  • 读写错误
©2026 搞英语 → 看世界 | Design: Newspaperly WordPress Theme