Python / Numpy 배열 연산의 성능은 배열 차원이 증가함에 따라 어떻게 확장됩니까?


21

Python / Numpy 배열은 배열 크기가 증가함에 따라 어떻게 확장됩니까?

이것은이 질문에 대한 파이썬 코드를 벤치마킹 할 때 발견 한 행동을 기반으로합니다 : numpy slices를 사용 하여이 복잡한 표현을 표현하는 방법

문제는 주로 배열을 채우는 색인 생성과 관련이 있습니다. 파이썬 루프에 비해 (아주 좋지 않은) Cython 및 Numpy 버전을 사용하는 이점은 관련된 배열의 크기에 따라 다릅니다. (주위 어딘가에 크게 두 NumPy와와 사이 썬 점에 경험이 증가 성능상의 이점까지 사이 썬과에 대한 자신의 장점을 거절 후 내 노트북에 NumPy와에 대한)합니다 (사이 썬 기능은 빠른 남아).N = 2000N=500N=2000

이 하드웨어가 정의되어 있습니까? 대규모 배열 작업과 관련하여 성능이 높이 평가되는 코드에 대해 준수해야 할 모범 사례는 무엇입니까?

벡터화 및 Cython 구현을위한 반복 코드에 대한 실행 시간 플롯

이 질문 ( Matrix-Vector Multiplication Scaling이 아닌 이유는 무엇입니까? )과 관련이있을 수 있지만 파이썬에서 배열을 처리하는 방법이 서로 어떻게 다른지에 대해 더 알고 싶습니다.


numexpr 을 사용해 보셨습니까 ? 예를 들어, bloscCArray 를 가리키는 이 대화 는 모두 속도를 높이고 메모리 대역폭 제한을 우회하는 것을 의미합니다.
0 0

1
프로파일 링에 사용 된 코드를 게시 할 수 있습니까? 아마도 여기에 몇 가지 일이있을 것입니다.
meawoppl

답변:


5

이 벤치 마크가 어떻게 수행되었는지는 모르지만 부동 소수점 숫자로 파이썬에서 기본적으로 두 배가됩니다. 크기는 각각 및 합니다. 이는 (약간 오래된) AMD CPU의 L1 및 L2 캐시 크기에 적합한 값입니다. 확실하게, 나는 내 자신의 벤치 마크를했다 :16 K의 B416kB

def timeit(size):
     t0 = time.time()
     for _ in xrange(10):
         np.random.random(size)
     return time.time() - t0

sizes = np.logspace(1, 6, 40)
times = [timeit(s) for s in sizes]

이 벤치 마크에는 몇 가지 잘못된 점이 있습니다. 처음으로 가비지 수집을 비활성화하지 않고 최상의 시간이 아니라 합계를 취하고 있습니다.

걸리는 시간은 배열의 크기에 비례하지만 크기 주위의 기울기 변화가 있습니다. 이것은 의 배열입니다 . 즉, i5 (내 컴퓨터)의 L1 캐시 크기입니다.64 k B800064kB

캐시 크기에 대해 걱정해야합니까? 일반적으로 아니요라고 말합니다. 파이썬에서 그것을 최적화한다는 것은 의심스러운 성능 향상을 위해 코드를 훨씬 더 복잡하게 만드는 것을 의미합니다. 파이썬 객체는 추적 및 예측이 어려운 몇 가지 오버 헤드를 추가한다는 것을 잊지 마십시오. 이것이 관련 요소 인 두 가지 경우 만 생각할 수 있습니다.

  • 메모리 대역폭에 의해 제한되는 대규모 배열 (다항식 평가와 같은)의 기본 작업. 사용 Numexpr 또는 (데이터가 더 큰 경우) Pytables . 이들은 다른 최적화 중에서 캐시 크기를 고려하도록 최적화되었습니다.
  • 퍼포먼스 크리티컬 코드 : 마이크로 초마다 짜내려면, 우선 파이썬을 사용해서는 안됩니다. 벡터화 된 Cython을 작성 하고 컴파일러가 최선의 작업을 수행하도록하는 것은 아마도 고통스러운 방법 일 것입니다.

의견에서 Evert는 CArray를 언급했습니다. 작동하더라도 개발은 중단되었으며 독립형 프로젝트로 포기되었습니다. 기능은 "새로운 세대 Numpy"를 만들기위한 지속적인 프로젝트 인 Blaze에 포함될 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.