Perl 6:检查元素是否在列表中的最佳方法是什么?

2024-05-09

假设我有一个大数组,@stuff, and a $thing,我想知道是否$thing is in @stuff。在 Perl 6 中做到这一点的最佳方法是什么?我所说的“最好”是指:惯用的、可读的、高性能的;不一定按这个顺序。

实际上有两个单独的案例。一是你必须针对不同的情况进行大量检查$things,另一个是您只执行一次或几次。

我们先来看第一个案例。我想我知道正确的答案。

my $set-of-stuff = set @stuff;
for @whatever -> $thing {
    do-something-with($thing) if $thing ∈ $set of stuff;
}

你实际上可以跳过第一行并简单地说... if $thing ∈ @stuff,但这几乎肯定会导致性能更差,因为每次都会创建该集合。

但现在第二种情况,我只有一个$thing去检查。 当然,上述解决方案是有效的,但是创建该集合只是为了检查一次,似乎需要很大的开销。 捷径

do-something-with($thing) if $thing ∈ @stuff;

这里更有意义,因为我们只调用它一次。但我们仍然必须创建一套供一次使用的集合。

更传统一点的是:

do-something-with($thing) if @stuff.grep($thing);

或者可能更快:

do-something-with($thing) if @stuff.first($thing);

但这似乎不太惯用,而且当然第二个的可读性不如$thing ∈ @stuff.

我不认为有一个智能匹配解决方案,对吧?当然这行不通:

do-something-with($thing) if $thing ~~ @stuff;

有什么想法吗?


取决于你对“最好”或“聪明”的定义是什么。

如果你谈论的是性能,我很确定

@stuff.first($thing)

是最快的。

习惯上,接近上述解决方案的是:

$thing ~~ any @stuff

由于自动线程,它具有更好的挂钟性能的潜力。

使用集合来执行此操作,使代码看起来更接近形式逻辑。但它不会使事情变得更快,因为需要创建该集合(除非它可以在编译时创建)。

不确定这个问题是否有“最佳”答案。

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

Perl 6:检查元素是否在列表中的最佳方法是什么? 的相关文章

随机推荐