gpt4 book ai didi

raku - Perl 6 中的正则表达式速度

转载 作者:行者123 更新时间:2023-12-04 17:43:37 25 4
gpt4 key购买 nike

我以前只与 bash 一起工作正则表达式,grep , sed , awk等尝试后Perl 6 regexes我的印象是它们的工作速度比我预期的要慢,但可能原因是我处理它们不正确。
我做了一个简单的测试来比较 Perl 6 中的类似操作并在 bash .这是Perl 6代码:

my @array = "aaaaa" .. "fffff";
say +@array; # 7776 = 6 ** 5

my @search = <abcde cdeff fabcd>;

my token search {
@search
}

my @new_array = @array.grep({/ <search> /});
say @new_array;

然后我打印了 @array进入一个名为 array 的文件中(7776 行),制作了一个名为 search 的文件用 3 行( abcdecdefffabcd )制作了一个简单的 grep搜索。

$ grep -f search array

在两个程序产生相同的结果后,正如预期的那样,我测量了它们工作的时间。

$ time perl6 search.p6
real 0m6,683s
user 0m6,724s
sys 0m0,044s
$ time grep -f search array
real 0m0,009s
user 0m0,008s
sys 0m0,000s

那么,我在 Perl 6 代码中做错了什么?

更新:如果我将搜索标记传递给 grep ,循环遍历 @search数组,程序运行得更快:

my @array = "aaaaa" .. "fffff";
say +@array;

my @search = <abcde cdeff fabcd>;

for @search -> $token {
say ~@array.grep({/$token/});
}

$ time perl6 search.p6
real 0m1,378s
user 0m1,400s
sys 0m0,052s

如果我手动定义每个搜索模式,它的工作速度会更快:

my @array = "aaaaa" .. "fffff";
say +@array; # 7776 = 6 ** 5

say ~@array.grep({/abcde/});
say ~@array.grep({/cdeff/});
say ~@array.grep({/fabcd/});

$ time perl6 search.p6
real 0m0,587s
user 0m0,632s
sys 0m0,036s

最佳答案

grep command 比 Perl 6 的正则表达式简单得多,而且它还有很多年的时间来优化。这也是 Rakudo 中没有看到太多优化的领域之一;部分原因是它被认为是一件很难处理的事情。

对于性能更高的示例,您可以预编译正则表达式:

my $search = "/@search.join('|')/".EVAL;
# $search = /abcde|cdeff|fabcd/;
say ~@array.grep($search);

这种变化导致它在大约半秒内运行。

如果 @search中存在恶意数据的可能性,并且您必须这样做,使用它可能更安全:

"/@search».Str».perl.join('|')/".EVAL

编译器无法完全为 /@search/ 生成优化代码如 @search编译正则表达式后可能会发生变化。可能发生的情况是,第一次使用正则表达式时,它会被重新编译为更好的形式,然后将其缓存至 @search 之久。不会被修改。
(我认为 Perl 5 做了类似的事情)

您必须记住的一个重要事实是,Perl 6 中的正则表达式只是一种用特定领域的子语言编写的方法。

关于raku - Perl 6 中的正则表达式速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46867216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com