오늘 나는 성능과 관련하여 Mathematica에 idiomatic way to count elements matching predicate 함수가 있는지 묻습니다.술어와 일치하는 요소를 가장 빨리 계산하는 방법
PredCount1[lst_, pred_] := [email protected][lst, pred];
나는 다른 lst
크기와 pred
로 대신
PredCount2[lst_, pred_] := Count[lst, x_/;[email protected]];
나는 이러한 기능을 프로파일 링 시작을 사용하는 제안을 얻었 : 주어진 조건 pred
에 대한
내 초기 접근 방식은 다음이었다 함수를 정의하고 두 가지 정의를 더 추가했습니다.
PredCount3[lst_, pred_] := Count[[email protected]@lst, True];
PredCount4[lst_, pred_] := Total[If[[email protected]#, 1, 0] & /@ lst];
내 데이터 샘플의 범위는 1 천만 개에서 1 천만 개까지이며, 테스트 기능은 EvenQ
, #<5&
및 PrimeQ
입니다. 다음 그래프는 취해진 시간을 보여줍니다.
EvenQ
PredCount2가 느리다, 3, 4 듀크 그것을.
비교 술어 : 그것은 내 실제 문제에서 필요에 가까운이기 때문에 # < 5 &
나는,이 기능을 선택했습니다. 이것이 바보 같은 테스트 함수라는 것에 대해 걱정하지 마라. 실제로 네 번째 함수가 약간의 장점을 가지고 있음을 증명한다. 나는 실제로 그것을 내 솔루션에서 사용했다.
EvenQ
과 동일
하지만 3이 단지 기괴한 명확보다 느린 4
PrimeQ
입니다. 모든 것이 뒤집혔다. 최악의 값은 마지막으로 계산 된 함수에 대한 것이므로 여기서 캐싱을 의심하는 것은 아닙니다.
따라서 주어진 조건부 함수와 일치하는 목록의 요소 수를 계산하는 가장 빠른 방법은 무엇입니까?
Timing [] 또는 AbsoluteTime []을 사용하고 있습니까? 타이밍 기능을 게시하십시오! –
카운트 할 목록의 요소 유형은 무엇입니까? Reals/Integers는 다르게 수행 할 수 있습니까? –
// Timing을 사용하고 목록은 Range @ num으로 생성되고 정수를 포함합니다. – Gleno