>source

이것은 아마도 numpy와 관련된 질문은 아니지만 나에게 발생한 질문은 내가 numpy 배열을 사용하여 code 조각을 최적화하려고 할 때였으며 좋은 예라고 생각합니다.

내 질문은 왜 numpy 배열이 정렬되었는지 여부를 "기억"하지 않는 것입니다. 이것은 표준 관계 연산자가 표현한 조건을 확인할 때 성능을 향상시킬 수있는 분명한 기회가 아닐까요?

설명하기 위해 명시 적으로 정렬되지 않은 배열을 인스턴스화합니다.

import numpy as np
x= np.arange(30000)
# unsorted array
y= np.random.choice(x, x.size, replace=False)

그런 다음 간단한>조건부 ...

%timeit y > 20
# 15.1 µs ± 870 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit y > 25000
# 14.8 µs ± 349 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

모든 값에 대해 거의 같은 시간이 소요됩니다 (배열의 모든 값에 대해 조건을 확인해야 함).

하지만 명시 적으로 배열을 정렬 한 다음 동일한 테스트를 실행하면 ...

y.sort()
%timeit y > 20
# 14.8 µs ± 737 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit y > 25000
# 14.8 µs ± 515 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

결과는 다소 동일하므로 배열의 모든 값에 대해 조건이 여전히 확인되고 있음을 나타냅니다.

Numpy 배열에 배열이 명시 적으로 정렬되었는지 여부를 나타내는 부울 속성이 있으면 다음과 같이 실행하여 성능을 향상시킬 수있는 기회가있는 것 같습니다.

def sorted_conditional(arr, z):
    for i,v in enumerate(arr):
        if v > z:
            return i

예 : i 이후의 모든 값이 i보다 크다는 것을 알고 있으므로 i가 v보다 크면 i 이후의 다른 모든 값도 v보다 큽니다 (다른 연산자의 경우도 유사).

물론 numpy가 제대로 최적화되지 않았다고 말하는 것은 아닙니다. 여기서 무엇을 놓치고 있는지 궁금합니다. 개체가 정렬 된 경우 "기억하는"개체의 개념에 논리적으로 일치하지 않는 것이 있습니까?

이는 프로그래머가 필요할 때 처리 할 수 ​​있고 처리해야하는 것에 대한 전체적인 오버 헤드를 추가합니다.

user2357112 supports Monica2021-03-03 04:17:38

이것은 배열의 모든 값에 대해 조건이 여전히 확인되고 있음을 시사합니다. y>20이 수행하도록 설계된 것입니다. 귀하의 sorted (arr, z) 함수는 다른 작업을 수행하는 것 같습니다.

Quang Hoang2021-03-03 04:17:38

@ user2357112supportsMonica가 정말 그렇게 더 많은 오버 헤드입니까? 여전히 순 성능 향상으로 보이지만 아마도 그렇지 않을 것입니다.

tofd2021-03-03 04:17:38

바로 그거죠. 정렬 된 경우 왜 기억하지 않습니까? 역 정렬 된 경우 왜 기억하지 않습니까? 그들이 긍정적인지 기억하지 못하는 이유는 무엇입니까? 부정적인 경우 왜 기억하지 않습니까? 왜 그들이 사각형인지 기억하지 못합니까? 왜 그들이 큐브인지 기억하지 못합니까? 피보나치 수열인지 기억하지 못하는 이유는 무엇입니까? 왜 그들은 ...

MisterMiyagi2021-03-03 04:17:38

배열 정렬은 매우 드문 작업이라고 생각합니다. 배열은 요소에 대한 반복 작업을 용이하게하도록 설계되었습니다. 주문은 일반적으로 문제가되지 않습니다.

chepner2021-03-03 04:17:38

numpy는 벡터화 된 작업에 최적화되어 있습니다. 정렬을 활용하는 알고리즘은 반복적입니다. 전자는 하드웨어를 훨씬 더 잘 활용할 수 있습니다. 그것이 논리적으로 더 적은 연산을 수행한다는 것을 의미하더라도 (하지만 여전히 평균 n /2) 순진한 비교를 사용하는 벡터화의 무차별적인 속도 이점 (평균적으로 연산의 두 배에 불과 함)은 가장 왜곡 된 상황을 제외하고는 모두이를 능가합니다.

MisterMiyagi2021-03-03 04:17:38

언급했듯이 numpy 컴파일 된 메서드는 대부분 묵시적인 순서없이 전체 배열에서 작동하도록 작성되었습니다. 이것이 가장 일반적인 목적의 경우입니다. 당신이 제안하는 것은 일종의 단락입니다. np.max와 같은 함수를 사용하여 몇 가지 값에 대해 수행한다고 생각합니다. 그러나 다른 경우에 이것이 필요하면 numba를 사용하십시오.

hpaulj2021-03-03 04:17:38
  • 이전 Javascript .map 및 배열에서 수학 수행
  • 다음 python : Pyspark Dataframe UDF에서 예외가 발생했습니다. 'TypeError : expected string or bytes-like object'