2016-09-29 5 views
0

너비가 많은 배열은 서로 다른 인접 유형 (C- 및 F-)으로 저장됩니다. numpy.swapaxes()를 사용하면 인접 유형이 변경됩니다. 두 개의 다차원 배열을 추가해야합니다 (보다 구체적으로는 3d). 그 중 하나는 교체 된 축이있는 다른 배열에서옵니다. 제가 주목 한 것은 첫 번째 축이 마지막 축과 바뀌면 3D 배열의 경우 인접한 유형이 C-에서 F-로 변경된다는 것입니다. 서로 다른 연속 형을 가진 두 개의 배열을 추가하는 것은 매우 느립니다 (두 개의 C 연속 배열을 추가하는 것보다 약 6 배 더 느립니다). 그러나 다른 축이 스왑 된 경우 (0-1 또는 1-2), 결과 배열은 C- 및 F- 연속 (인접하지 않음)에 대해 거짓 플래그를 갖게됩니다. 이상한 것은 C 배열과 C 배열 또는 F 배열 중 하나의 배열을 추가하는 것이 실제로 같은 유형의 배열 두 개를 추가하는 것보다 약간 느리다는 것입니다. 여기 내 두 가지 질문은 다음과 같습니다다른 인접 유형을 사용하는 수분이 적은 배열의 추가 속도

  1. 이 왜 C- & F-연속 arrray 추가 및 C- & 비 연속 배열 또한 다른 것 같다니까? Is는 C-F와 F- 연속 사이의 재 배열 거리가 가능한 모든 축 순서에서 가장 길기 때문에 다른 재배치 메커니즘으로 인해 발생합니까?

  2. C 연속 배열과 F 연속/비 연속 배열을 추가해야하는 경우 속도를 빠르게하는 가장 좋은 방법은 무엇입니까?

다음은 내가 만난 최소 예입니다. 내 컴퓨터의 3 가지 인쇄 지속 시간은 2.0s (C 연속 + C 연속), 12.4 초 (C 연속 + F 연속), 3.4 초 (연속 연속 + 비 연속) 및 3.3 초 (연속 연속 + C 연속) + 불연속). 매트릭스 (또는 다차원 배열)에 저장되어 있는지

import numpy as np 
import time 

np.random.seed(1234) 

a = np.random.random((300, 400, 500)) # C-contiguous 
b = np.swapaxes(np.random.random((500, 400, 300)), 0, 2) # F-contiguous 
c = np.swapaxes(np.random.random((300, 500, 400)), 1, 2) # Non-contiguous 
d = np.swapaxes(np.random.random((400, 300, 500)), 0, 1) # Non-contiguous 

t = time.time() 
for n in range(10): 
    result = a + a 
print(time.time() - t) 

t = time.time() 
for n in range(10): 
    result = a + b 
print(time.time() - t) 

t = time.time() 
for n in range(10): 
    result = a + c 
print(time.time() - t) 

t = time.time() 
for n in range(10): 
    result = a + d 
print(time.time() - t) 

답변

0

이러한 유형 (FC) 나타낸다 열 주요 (C C 언어와 같은 열 주요 스토리지 사용) 또는 행 - 전공 (F을 행 - 주요 저장소를 사용하는 Fortran 언어 에서처럼).

둘 다 실제로 속도가 변하지 않습니다. 그것은 단지 추상화 계층입니다. 어떤 것을 사용하든 관계없이 동일한 성능을 제공합니다.

그러나 배열이 연속적인지 여부는 큰 차이가 있습니다. 연속적이라면 컴파일러가 적용 할 수있는 캐싱 효과, 벡터화 및 기타 최적화 게임의 타이밍이 좋습니다.

+1

Promt 답장을 보내 주셔서 감사합니다. Armen! 인접 유형은 추상화 계층이라는 것을 이해합니다. 그러나 파이썬에서 서로 다른 연속 된 두 개의 배열을 추가 할 때 어떤 종류의 변환이 수행되어 매우 나쁜 성능을 보이는 것으로 보입니다. 적어도 내 컴퓨터에서는이 동작을 보여주는 예제 코드를 업데이트했습니다. – DingLuo

+0

실제로 변환이 시작됩니다. –