2017-04-30 1 views
1

product에서 Iterator.jl을 사용하여 입력의 데카르트 곱에서 모든 조합을 반복 할 수 있습니다.데카르트 곱을 반복하는 것은 느림

using Iterators 

@time(
for tup in product(-100:100, -100:100, -100:100) 
    # do something with silly tup 
    maximum(tup) 
end 
) 
# 10.033157 seconds (64.97 M allocations: 3.510 GB, 3.03% gc time) 

똑바로 앞으로 중첩 루프 :

@time(
for x in -100:100, y in -100:100, z in -100:100 
    # do something silly with x, y, z 
    maximum([x y z]) 
end 
) 
# 0.420949 seconds (8.12 M allocations: 867.374 MB, 4.31% gc time) 

사람이 왜 알고 있나요 그러나 그것은 단지 "짐승이 강제"보다 훨씬 느린 것으로집니다? (product에서 반환 된 반복자를 사용하는 것은 큰 직교 격자를 통해 전 pmap에 대한 한을 허용, 블록 아래 간단한 코드로 이어질 것 줄리아 v"0.5.1" 사용.)

답변

3

Iterators.jl의 많은 기능이 이제 버전 0.6의 Julia의 Base.Iterators 모듈에 내장됩니다. 대신 using Iterators, 당신은 Base.Iterators 대신에 버전을 사용할 수 있습니다

julia> @time(
     for tup in product(-100:100, -100:100, -100:100) 
      # do something with silly tup 
      maximum(tup) 
     end 
     ) 
18.110503 seconds (64.98 M allocations: 3.510 GiB, 3.32% gc time) 

julia> @time(
     for tup in Base.Iterators.product(-100:100, -100:100, -100:100) 
      # do something with silly tup 
      maximum(tup) 
     end 
     ) 
    0.658809 seconds (8.12 M allocations: 247.821 MiB, 5.50% gc time) 

그것은 크게하지만, 일반적으로,이 결과에 영향을 미치는 아니에요 당신이해야 전역에서하지 벤치 마크 당신이 줄리아의 일반적인 프로그램을 실행하는 방법을 대표하지 이후 . 함수 안에 코드를 래핑하십시오.

두 가지가 어떻게 다른지 궁금하다면 the differencein implementations을 볼 수 있습니다. Base의 구현은 많은 핵심 구조 (이해력 및 생성기와 같은)에서 사용되기 때문에 매우 최적화되어 있습니다. 벡터화되지 않은 Any[] 벡터를 사용하는 copy 호출을 비롯하여 의 형식 불안정성을 포함하여 Iterators.jl 구현이 느린 데는 여러 가지 이유가 있습니다.

+0

고마워요,하지만이 특정 예에서는 전역 범위에서의 입력과 입력 된 함수 내에서 타이밍간에 차이가 있다고 생각하지 않았습니다 ...? (또는 나는 무엇인가 놓치고 있습니까?) – luffe

+0

그래, 그것은 일반적으로 적용 할 수없는 혼란스러운 결과로 이어질 수 있기 때문에 미래에 대한 단지주의입니다. –

1

이 잘 시간 출력이 많은 당신을 알려줍니다

64.97 product()에 대한 M 할당은 3.5GB의 메모리와 같은 것을 통해 씹는 행위입니다. '867MB 만 먹는 8.12M 배정.

메모리 할당이 느립니다. 당신이 더 많은 양의 할당과 더 큰 배분을 고려한다면 당신의 속도가 느려질 것입니다.

+0

감사합니다. 나는 메모리 할당이 범인이라는 암묵적인 생각을했습니다. 질문은 왜 효율적이라고 생각되는 반복자가이 많은 메모리를 요구하는지입니다. :) 분명하지 않다면 미안 해요. – luffe

+0

아, 글쎄, 만약 당신이 Iterator.jl이 라인 245에서 280까지 무엇을하는지 보면 ... 많은 복사가 포함될 것입니다. – user268396

+0

고마워, 어쩌면 나는 그들의 github repo에 이것에 대해 물어 봤어야했다. – luffe

관련 문제