2017-01-20 13 views
6

큰 배열 @stuff$thing을 가지고 있고 $thing@stuff에 있는지 알고 싶다고 가정 해 봅시다. Perl 6에서 그렇게하는 가장 좋은 방법은 무엇입니까? 그리고 "최고"라는 뜻은 : 관용적이며, 읽기 쉽고, 공연하는 사람입니다. 꼭 그런 순서는 아닙니다.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; 

어떤 생각?

답변

11

"최고"또는 "스마트"의 정의에 따라 결정됩니다.

성능에 대해 이야기한다면, 나는

@stuff.first($thing) 

가 가장 빠른 확신합니다.

관용구, 그리고 위의 솔루션에 가까운는 다음과 같습니다 인해 자동 스레딩 더 나은 wallclock 성능의 잠재력을 가지고

$thing ~~ any @stuff 

합니다.

집합을 사용하여 코드를 공식 논리에 가깝게 보이게합니다. 그러나 세트를 생성해야하기 때문에 (컴파일 타임에 작성되지 않는 한) 세트를 작성해야하므로 일을 더 빨리 만들지는 못합니다.

확실한 답변이없는 것은 확실합니다.

+0

감사합니다. 나는 '모든 것'에 대해 생각해 보았습니다.그러나, 나의 경험에서, 현재의 Rakudo 버전에있는 접속점은 매우 느리다. 그래서 그것은 아마 좋은 옵션 (아직)이 아니다. – mscha

+0

그리고 "최고"무엇입니까? 음, 상황에 따라 달라질 것 같습니다. 이상적으로는 최고의 성능, 숙어 (sic?) 및 가독성. 그러나 실제로는 타협해야합니다. 예를 들어 가독성을 위해 일부 성능을 희생시킬 수는 있지만 많지는 않습니다. – mscha

+0

실제로'[email protected] ($ thing)'은'@ stuff.first ($ thing)'만큼 빠르다. (일치하는 것을 찾은 후에 멈추기 때문에) –