在 Perl 6 中使用正则表达式和 .contains 进行过滤

2024-03-10

我经常需要过滤元素array字符串,包含一些子字符串(例如一个字符)。因为它可以通过匹配来完成regex或与.contains方法,我决定做一个小测试以确保.contains更快(因此更合适)。

my @array = "aa" .. "cc";
my constant $substr = 'a';

my $time1 = now;
my @a_array = @array.grep: *.contains($substr);
my $time2 = now;
@a_array = @array.grep: * ~~ /$substr/;
my $time3 = now;

my $time_contains = $time2 - $time1;
my $time_regex    = $time3 - $time2;
say "contains: $time_contains sec";
say "regex:    $time_regex sec";

然后我改变大小@array和长度$substr并比较每种方法过滤所需的时间@array。在大多数情况下(如预期),.containsregex,特别是如果@array很大。但如果是小量的情况@array(如上面的代码)regex稍微快一些。

contains: 0.0015010 sec
regex:    0.0008708 sec

为什么会出现这种情况?


在一个完全不科学的实验中,我只是切换了正则表达式版本和包含版本,发现您测量的性能差异不是“正则表达式与包含”,而是实际上“第一件事与第二件事”:

当 contains 优先时:

contains: 0.001555  sec
regex:    0.0009051 sec

当正则表达式首先出现时:

regex:    0.002055 sec
contains: 0.000326 sec

正确地进行基准测试是一项艰巨的任务。很容易意外地测量出与您想要的结果不同的东西。

当我想比较多个任务的性能时,我通常会在单独的脚本中运行每个任务,或者可能有一个共享脚本,但一次只运行其中一个任务(例如使用multi sub MAIN("task1")方法)。这样任何启动工作都可以共享。

在 freenode 上的 #perl6 IRC 频道中,我们有一个名为 benchable6 的机器人,它可以为您做基准测试。读其 wiki 页面上的“比较代码”部分 https://github.com/perl6/whateverable/wiki/Benchable#comparing-code了解它如何为您比较两段代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Perl 6 中使用正则表达式和 .contains 进行过滤 的相关文章

  • 无法将地图放入接收器上下文中

    我正在尝试查看在接收器上下文中抛出地图的方法 在这段代码中 class Sunk has titanic method sink say Sinking titanic Sunk new titanic for 1 3 1 3 map Su
  • 我了解 Perl 5。学习 Perl 6 比转向 Python 有什么优势? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Perl 6 如何评估真实性?

    在阅读有关 Perl 6 的内容时 我看到一个被大肆宣传的功能 您不再需要这样做 return 0 but true 但可以这样做 return 0 but True 如果是这样的话 Perl 6 中的 Truth 是如何工作的呢 在 Pe
  • 如何定义“AT-POS”方法?

    我定义了AT POS类的方法并导出 操作员 当我使用 然而 在该类的实例上 编译器忽略了我定义的运算符 这是代码 unit module somelib class SomeClass is export method AT POS ind
  • perl6如何获取promise的具体身份?

    我正在尝试编写在 Promise 中运行的 3 个 echo 服务器的代码 但我想知道哪个 Promise 正在执行回显 有没有办法做到这一点 no strict for 0 2 gt index result index start my
  • Perl 6 有无限的 Int 吗?

    我有一个任务 我想找到距离目标最近的字符串 因此 编辑距离 而不是同时生成它们 我想我应该使用高水位线技术 我猜是低水位线 同时初始化最近的编辑距离Inf这样任何编辑距离都会更近 use Text Levenshtein my string
  • 宏观定义中的“位置太少”

    我正在尝试创建一些以这种方式使用 实验 宏的示例 use experimental macros macro cards vars
  • Raku .hyper() 和 .race() 示例不起作用

    以下示例代码应加速 Raku 程序的执行 for 1 4 race say Doing sleep 1 say now INIT now 我记得不久前它还有效 但现在我总是以 4 秒的运行时间结束 同样使用 race 或添加参数不会改变任何
  • Perl 6 中的递归正则表达式?

    我一直在试图弄清楚如何在 Perl 6 中执行递归正则表达式 对于一个玩具示例 平衡括号匹配器 它将匹配 inside PCRE https regex101 com r otEKh5 1例子 R Onigmo https rubular
  • 只有“perl6”才能解析 Perl 6 吗?

    有一条 相对 众所周知的 Perl 公理 只有 Perl 可以解析 Perl 我想知道 Perl 6 是否仍然如此 扩大讨论 考虑到 PyPy 最近的更新 我想到了这个问题 Perl 独特的可解析性是否使其无法进行类似的努力 Perl 代码
  • 如何将类方法作为参数传递给perl 6中类的另一个方法

    我有一个如下所示的脚本 目的是使用不同的过滤方法来过滤列表 这是代码 2 3 class list filter 4 has my list 1 20 5 6 method filter l return True 7 8 filter m
  • 通过 Comma IDE 使用时间轴可视化时出现“无法获取时间轴数据”

    执行答案后这个问题是关于如何设置时间可视化脚本 https stackoverflow com questions 58428899 do we need to modify a script to be able to use the t
  • 使用 NativeCall 将 C 库函数合并到 Perl6 中

    我正在尝试使用lgamma来自 C 的math h在 Perl6 中 我如何将其合并到 Perl6 中 我努力了 use NativeCall sub lgamma num64 gt num64 is native Str say lgam
  • 在 Perl 6 中查找上周五的日期?

    我想生成一个从周一到周四的上周五结束的序列 如果该序列从周六和周日开始 则生成上周五结束的序列 也就是说 假设今天是2018 05 09 那么上周五是2018 05 04 如果今天是2018 05 12 那么上周五是also 2018 05
  • Perl 6 规则中 .parse 锚点还是 :sigspace 首先?

    我有两个问题 我表现出的行为是否正确 如果是 它是否记录在某处 我在玩语法TOP方法 宣布为rule 它意味着字符串的开头和结尾锚点以及 sigspace grammar Number rule TOP d my strings 137 1
  • 使用 Perl6 语法解析二进制结构

    使用 Perl6 解析二进制结构的最佳选择是什么 在 Perl5 中 我们在 Perl6 上有 pack unpack 方法 它们似乎是实验性的 是否可以使用 Perl6 语法来解析二进制数据假设我有一个文件 其中包含以下二进制格式的记录
  • 语法的替代版本无法按照我的意愿工作

    这段代码解析 string如我所愿 usr bin env raku my string q to END aaa bbb this has trailing spaces which I want to keep kjkjsdf kjkd
  • Perl 6 可以根据排序规则进行排序或比较吗?

    The cmp操作员 https docs perl6 org language operators infix cmp适用于代码编号 或者至少我认为它是这样做的 因为文档对此没有明确说明 并且没有提及任何本地化内容 我可以按照其他排序规则
  • Perl 6 语法与我认为的不匹配

    我正在做代码出现第 9 天 http adventofcode com 2017 day 9 您坐了一会儿并记录了流的一部分 您的谜题输入 这些字符代表组 开头的序列 并结束于 在一个组内 有零个或多个其他东西 用逗号分隔 要么是另一个组
  • Perl 6:检查元素是否在列表中的最佳方法是什么?

    假设我有一个大数组 stuff and a thing 我想知道是否 thing is in stuff 在 Perl 6 中做到这一点的最佳方法是什么 我所说的 最好 是指 惯用的 可读的 高性能的 不一定按这个顺序 实际上有两个单独的案

随机推荐