gpt4 book ai didi

raku - Perl 6 : what's the best way to check if an element is in a list?

转载 作者:行者123 更新时间:2023-12-04 13:46:33 25 4
gpt4 key购买 nike

假设我有一个大数组,@stuff , 和 $thing ,我想知道是否$thing@stuff .在 Perl 6 中做到这一点的最佳方法是什么? “最好”的意思是:惯用的、可读的、高效的;不一定按这个顺序。

实际上有两种不同的情况。一是您必须对不同的 $thing 进行大量检查。 s,另一个是你只做一次或几次。

我们先来看第一种情况。我想我知道(或一个)正确答案。

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

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

使用集合来做到这一点,使代码看起来更接近形式逻辑。但它不会使事情更快,因为需要创建集合(除非它可以在编译时创建)。

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

关于raku - Perl 6 : what's the best way to check if an element is in a list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41763453/

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