실제로 두 가지 질문이 있습니다. 그 중 하나는 제목과 그 뒤에 숨어있는 질문입니다. 첫 번째는 응답 : 1의의 실행의 수를 계산,
First/@ list
두 번째, 여러 번 대답하지만,이 솔루션
Total[Clip[ListCorrelate[{-1, 1}, #], {0, 1}]] + First[#] &
는 레오 니드의 솔루션보다 약 50 % 더 빠르다되었습니다 . 더 나은 타이밍 테스트 목록의 길이를 증가 참고 :
largeTestList = RandomInteger[{0, 1}, {10000000}];
Count[Split[largeTestList], {1 ..}] // AbsoluteTiming
Count[Split[largeTestList][[All, 1]], 1] // AbsoluteTiming
Total[Clip[[email protected]#, {0, 1}]] + First[#] &@ largeTestList // AbsoluteTiming
([email protected]@[email protected]# + [email protected]#[[{1, -1}]])/2 &@ largeTestList // AbsoluteTiming
Total[Clip[ListCorrelate[{-1, 1}, #], {0, 1}]] + First[#] &@
largeTestList // AbsoluteTiming
Out[680]= {3.4361965, 2498095}
Out[681]= {2.4531403, 2498095}
Out[682]= {0.2710155, 2498095}
Out[683]= {0.2530145, 2498095}
Out[684]= {0.1710097, 2498095}
레오 니드의 컴파일 공격 후 내가 항복하려고했지만, 나는 가능한 최적화를 발견, 그래서 이후 전투를 간다 .. . 결과는 다를
runsOf1Cbis =
Compile[{{lst, _Integer, 1}},
Module[{r = Table[0, {Length[lst] - 1}], i = 1, ctr = First[lst]},
For[i = 2, i <= Length[lst], i++,
If[lst[[i]] == 1 && lst[[i - 1]] == 0, ctr++; i++]];
ctr], CompilationTarget -> "C", RuntimeOptions -> "Speed"]
largeTestList = RandomInteger[{0, 1}, {10000000}];
Total[Clip[ListCorrelate[{-1, 1}, #], {0, 1}]] + First[#] &@
largeTestList // AbsoluteTiming
runsOf1C[largeTestList] // AbsoluteTiming
runsOf1Cbis[largeTestList] // AbsoluteTiming
Out[869]= {0.1770101, 2500910}
Out[870]= {0.0960055, 2500910}
Out[871]= {0.0810046, 2500910}
[Mr.Wizard, 레오 니드 나는 SO의 평화를 방해 감옥에 던져해야한다, 그러나 나는 10와 30 % 사이의 향상을 얻을.
최적화가 잘 수행되지 않지만 {0,1} 테스트가 성공하면 i++
이 추가됩니다. 연속 된 위치에 두 가지를 가질 수는 없습니다.
그리고 여기, 자신의 최적화 내 최적화의 레오 니드의 최적화 최적화 (나는이 장기화하지 않을 희망, 또는 내가 스택 오버 플로우 고통을거야)
runsOf1CDitto =
Compile[{{lst, _Integer, 1}},
Module[{i = 1, ctr = First[lst]},
For[i = 2, i <= Length[lst], i++,
If[lst[[i]] == 1, If[lst[[i - 1]] == 0, ctr++];
i++]];
ctr], CompilationTarget -> "C", RuntimeOptions -> "Speed"]
largeTestList = RandomInteger[{0, 1}, {10000000}];
Total[Clip[ListCorrelate[{-1, 1}, #], {0, 1}]] + First[#] &@
largeTestList // AbsoluteTiming
runsOf1C[largeTestList] // AbsoluteTiming
runsOf1Cbis[largeTestList] // AbsoluteTiming
runsOf1CAlt[largeTestList] // AbsoluteTiming
runsOf1CDitto[largeTestList] // AbsoluteTiming
Out[907]= {0.1760101, 2501382}
Out[908]= {0.0990056, 2501382}
Out[909]= {0.0780045, 2501382}
Out[910]= {0.0670038, 2501382}
Out[911]= {0.0600034, 2501382}
을
나를 위해 운좋게도, Leonid는 제거 될 수있는 코드에서 불필요한 초기화 작업을 수행했습니다.
완벽한, 정말 고마워요! 내가 [전체, 1] 하위 목록에 액세스하려고했는데, 나는 셀 수있는 패턴을 알아낼 수 없었다. 그래서 패턴은 단순히 1입니다. 맞습니까? –
예,이 경우 패턴은 리터럴 1입니다. –