Perl 6:检查元素是否在列表中的最佳方法是什么?
Perl 6: what's the best way to check if an element is in a list?
假设我有一个大数组 @stuff
和一个 $thing
,我想知道 $thing
是否在 @stuff
中。在 Perl 6 中最好的方法是什么? “最好”的意思是:惯用的、可读的、高性能的;不一定按这个顺序。
实际上有两个独立的案例。一个是你必须为不同的 $thing
做很多检查,另一个是你只做一次或几次。
我们先来看第一种情况。我想我知道(或一个)正确答案。
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;
有什么想法吗?
取决于您对 "best" 或 "smart" 的定义。
如果你说的是性能,我很确定
@stuff.first($thing)
最快。
习惯上接近上述解决方案的是:
$thing ~~ any @stuff
由于 auto-threading,它具有更好的挂钟性能的潜力。
使用集合来做到这一点,使代码看起来更接近形式逻辑。但它不会让事情变得更快,因为需要创建集合(除非它可以在编译时创建)。
不确定是否有 "best" 答案。
假设我有一个大数组 @stuff
和一个 $thing
,我想知道 $thing
是否在 @stuff
中。在 Perl 6 中最好的方法是什么? “最好”的意思是:惯用的、可读的、高性能的;不一定按这个顺序。
实际上有两个独立的案例。一个是你必须为不同的 $thing
做很多检查,另一个是你只做一次或几次。
我们先来看第一种情况。我想我知道(或一个)正确答案。
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;
有什么想法吗?
取决于您对 "best" 或 "smart" 的定义。
如果你说的是性能,我很确定
@stuff.first($thing)
最快。
习惯上接近上述解决方案的是:
$thing ~~ any @stuff
由于 auto-threading,它具有更好的挂钟性能的潜力。
使用集合来做到这一点,使代码看起来更接近形式逻辑。但它不会让事情变得更快,因为需要创建集合(除非它可以在编译时创建)。
不确定是否有 "best" 答案。