【问题标题】:Fastest way to do many, many different gsub operations?做很多很多不同的 gsub 操作的最快方法是什么?
【发布时间】:2012-05-23 17:11:38
【问题描述】:

我正在将数以万计的文档从一种标记格式(显然是 RUNOFF 的一些后代,我有最少的文档)转换成我可以提供给 LaTeX 的东西。此过程的一部分涉及在每个文档中搜索在旧标记格式中具有特殊含义的每个字符串,并将其替换为适合 LaTeX 的字符串。有数百个。到目前为止,我的两个想法是将每个都作为单独的 gsub 或使用将匹配(通过 ORing)许多符号的正则表达式制作 gsub,然后将匹配传递给带有大 case 语句的方法,该语句将通过返回适当的替换。从表面上看,第二种方法减少了必须扫描每个文档的次数,但正则表达式中 OR 的开销可能更昂贵。有没有人知道哪种方法更好,或者我错过了一种好方法?

以下是我所描述的两种方式的示例。他们可能不完美。只是想表达我的意思。

方法一:

output.gsub!(/a<-"/, '\\"{a}') # ä
output.gsub!(/a<-^/, '\\^{a}') # â
output.gsub!(/a<-~/, '\\~{a}') # ã
...etc

方法二:

output.gsub!(/a<-"|a<-^|a<-~|etc/) {|match| convert_symbol(match)}

def convert_symbol(input)
  case match
  when 'a<-"'
    '\\"{a}' # ä
  when "a<-^"
    '\\^{a}' # â
  when "a<-~"
    '\\~{a}' # ã
  when 'etc'
    '\\LaTeX...etc'
  end
end

【问题讨论】:

  • 为什么不在几个文件上同时进行基准测试,看看哪个更快?
  • 是的,这是最好的建议。太好了……我对我的方法和 Mori 的方法都做了基准测试,结果发现它们的速度几乎相同。这实际上有点令人惊讶。为了确定,我使用多个样本输入多次尝试。所以,这只是哪个最容易阅读和维护的问题......

标签: ruby regex gsub


【解决方案1】:

哇,有很多文件。但我认为,如果我这样做,我不会担心程序的效率如何。电脑又快又便宜,不介意整夜跑。

实际上,我认为我不会在一般情况下打开代码(连接到程序中)正则表达式。我想我会将替换项放入一个平面文件或 YAML 文件中,并且只将那些需要状态的表达式或功能构建到程序中。

因此,如果我需要记住一个标记,我可能会在其中构建表达式,或者在一个充满转码表达式的 YAML 文件中标记它……我最担心的是我的程序结构的好坏。我会尽量减少摆弄它和运行测试的时间,至少一开始不用担心它的运行速度。

特别是,这个程序一旦完成,每个文档只运行一次。因此,它并不是仔细优化速度的好选择。此外,由于它只运行一次,然后你必须永远接受它的决定,我认为你的重点应该放在保真度而不是速度上。

【讨论】:

  • 通常我会同意,但在这种情况下,速度是一个考虑因素。解释为什么会占用比此处允许的更多空间(尽管我不介意解释)。另请注意,必须订购替换件(或至少其中的一组)才能正确进行翻译。因为我缺乏输入格式的完整规范,所以我不得不推断需要做什么。这意味着翻译步骤的顺序可能会随着“发现”新的请求而改变。它是一个挑战和一个 PITA。感谢您的建议...我是一名初级开发人员,每个角度都对我有帮助。
  • 祝你好运!顺便说一句,如果您发布了一些原始标记,我相信我们可以识别格式。
【解决方案2】:
{ /a<-"/ => '\\"{a}', 
  ... 
}.each { |find, replace| output.gsub! find, replace }

【讨论】:

    【解决方案3】:

    这些都是相同的通用格式吗?然后你可以简单地

    output.gsub!(/([aeiouy])<-(["~^])/, '\\\2{\1}')
    

    ...假设 Ruby 在 \1\2 等中有反向引用(抱歉,不太熟悉该语言)。

    【讨论】:

    • 它们并非都是相同的通用格式。大片是……但更大的片不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2020-05-03
    • 1970-01-01
    • 2013-12-23
    • 2020-10-21
    相关资源
    最近更新 更多