dlu*_*kes 6 regex grep haskell
每当我考虑学习一种新语言 - 在这种情况下为haskell - 我试图将一个原始的grep克隆组合在一起,看看语言实现和/或它的库在文本处理方面有多好,因为这对我来说是一个主要的用例.
受到haskell wiki代码的启发,我想出了以下天真的尝试:
{-# LANGUAGE FlexibleContexts, ExistentialQuantification #-}
import Text.Regex.PCRE
import System.Environment
io :: ([String] -> [String]) -> IO ()
io f = interact (unlines . f . lines)
regexBool :: forall r l .
(RegexMaker Regex CompOption ExecOption r,
RegexLike Regex l) =>
r -> l -> Bool
regexBool r l = l =~ r :: Bool
grep :: forall r l .
(RegexMaker Regex CompOption ExecOption r, RegexLike Regex l) =>
r -> [l] -> [l]
grep r = filter (regexBool r)
main :: IO ()
main = do
argv <- getArgs
io $ grep $ argv !! 0
Run Code Online (Sandbox Code Playgroud)
这似乎正在做我想要的,但不幸的是,它真的很慢 - 比做同样事情的python脚本慢大约10倍.我认为这不是正则表达式库在这里有问题,因为它正在调用PCRE,它应该足够快(切换到更Text.Regex.Posix慢的速度).所以它必须是String实现,从理论的角度来看是有益的,但根据我所读到的,效率低下.
String在haskell中是否有一种替代方法既有效又方便(即切换到使用它而不是Strings 时几乎没有摩擦)并且完全正确地处理UTF-8编码的Unicode,以及其他编码没有太多麻烦,如果可能的话?在haskell中进行文本处理时每个人都使用的东西,但我只是不知道因为我是一个完全的初学者?
速度慢可能是由于使用标准库的列表类型造成的。我过去经常遇到它的性能问题。
分析你的可执行文件是一个好主意,看看它把时间花在哪里:用于分析 Haskell 程序性能的工具。分析 Haskell 程序非常简单(使用开关编译并使用添加的参数执行程序,并将报告写入当前工作目录中的文本文件)。
附带说明一下,我在学习新语言时使用与您完全相同的方法:创建有用的东西。我使用 Haskell 进行此操作的经验是,通过分析和进行相对简单的更改(通常是几行),我可以轻松地将性能提高一两个数量级。
| 归档时间: |
|
| 查看次数: |
387 次 |
| 最近记录: |