2013-07-09 2 views
19

저는 공학 시뮬레이션 학생으로서 수치 시뮬레이션을 위해 현재 MATLAB에서 Python으로 전환하고 있습니다. 나는 기본적인 배열 조작을 위해 Numpy가 MATLAB만큼 빠르다는 인상을 받았다. 그러나 MATLAB이 Numpy보다 두 배 빠르기 때문에 필자가 작성한 두 가지 프로그램에 대해 나타납니다. 내가 NumPy와 위해 사용하고 테스트 코드 (파이썬 3.3)입니다 :Numpy의 두 배 빠른 MATLAB

import numpy as np 
import time 

a = np.random.rand(5000,5000,3) 

tic = time.time() 
a[:,:,0] = a[:,:,1] 
a[:,:,2] = a[:,:,0] 
a[:,:,1] = a[:,:,2] 
toc = time.time() - tic 
print(toc) 

MATLAB의 2012A를 위해 내가 사용하고있는 반면 :

a = rand(5000,5000,3); 

tic; 
a(:,:,1) = a(:,:,2); 
a(:,:,3) = a(:,:,1); 
a(:,:,2) = a(:,:,3); 
toc 

내가 사용하고 알고리즘은 비교하는 NASA website에 사용되는 하나입니다 Numpy와 MATLAB. 이 웹 사이트는 Numpy가이 알고리즘의 속도면에서 MATLAB을 능가한다는 것을 보여줍니다. 그러나 내 결과는 Numpy의 경우 0.49 초, MATLAB의 경우 0.29 초의 시뮬레이션 시간을 보여줍니다. 나는 또한 Numpy와 Matlab 모두 Gauss-Seidel 솔버를 실행했으며 비슷한 결과를 얻었습니다 (16.5 초 대 9.5 초)

저는 파이썬에 아주 새로운 지식을 보유하고 있으며 프로그래밍 측면에서 많은 지식이 없습니다. WinPython 64 비트 Python 배포판을 사용하고 있지만 Pythonxy를 사용하지 않으려 고 시도했습니다.

내가 읽은 한 가지는 성능을 향상시켜야한다는 것이 MKL을 사용하여 Numpy를 구축하는 것입니다. 불행히도 Windows에서이 작업을 수행하는 방법을 모릅니다. 나는 이것을 할 필요가 있니?

제안 사항?

+0

Christoph Gohlke는 많은 Python 패키지에 대한 사전 컴파일 된 Windows 바이너리를 제공하며 NumPy는 Intel MKL에 링크되어 있습니다. http://www.lfd.uci.edu/~gohlke/pythonlibs/ – Amro

+0

예. 파이썬은 Matlab에 비해 훨씬 느린 편 이었으므로 운이 좋았습니다. :-) – horchler

+2

WinPython의 현재 배포본 [이미 NumPy-MKL과 함께 제공] (https://code.google.com/p/winpython/wiki/PackageIndex_33). – Jaime

답변

51

연속적인 메모리 덩어리를 전송하거나 일부 작업을 수행하는 것이 더 효율적이기 때문에 캐싱으로 인해 오렌지가 사과가됩니다. 이 특정 벤치 마크는 실제로 계산이 수행되지 않으므로 메모리 바인딩이므로 캐시 적중률이 좋은 성능을 달성하는 데 중요합니다.

Matlab은 열 우선 순위 (포트란 순서)로 데이터를 배치하므로, a(:,:,k)은 연속적인 메모리 덩어리로 빠른 복사가 가능합니다.

기본적으로 Numpy는 행 우선 순서 (C 순서)를 기본으로하므로 a[:,:,k]에서 요소 사이에 큰 점프가 발생하고 메모리 전송 속도가 느려집니다. 사실, 데이터 레이아웃을 선택할 수 있습니다. 내 랩톱에서 a = np.asfortranarray(np.random.rand(5000,5000,3))으로 어레이를 만들면 5 배속 (1 초 vs. 0.19 초)이되었습니다.

이 결과는 numpy-MKL과 일반 numpy 모두에서 매우 비슷해야합니다. MKL은 빠른 LAPACK 구현이므로 여기서는이를 사용하는 함수를 호출하지 않습니다. MKL은 점 시스템을 계산할 때 선형 시스템을 해결할 때 분명히 도움이됩니다. ..).

Gauss Seidel 솔버에서 무슨 일이 벌어지고 있는지 알지 못하지만, 얼마 전 MKL, FFT 및 Matlab의 JIT에 대해 약간 이야기하는 Numpy running at half the speed of MATLAB이라는 질문에 대한 답변을 작성했습니다.

+0

방금 ​​나는 이것이 downvoted다는 것을주의했다 (저를위한 첫번째이다). 대답을 향상시키는 방법에 대한 의견이 있으십니까? – jorgeca

+0

좋아, 나는 다른 배열 건설을 사용하여 당신의 제안을 시도하고 그것도 훌륭한 Numpy에서 ~ 5x 속도로 이끌었다. Gauss-Seidel 솔버에서이 제안을 시도했지만 또 다른 문제점이 있음을 시사하는 것은 아닙니다. 이 솔버에서 어떤 멋진 기능이나 어떤 것도 사용하지 않고 있습니다. 약 16 줄의 벡터화 된 할당과 몇 개의 제어문을 사용하는 while 루프입니다. 당신이 낡은 주제에서 쓴 것은 또한 도움이되지 않습니다. 검사 할 코드를 보낼 수있는 방법이 있습니까, 아니면 새로운 질문으로 질문 할 수 있습니까? – nicholls

+0

문제가 다르기 때문에 더 많은 사람들이 혜택을받을 수 있도록 다른 질문을 할 수 있습니다! – jorgeca

3

많은 변수를 변경했지만 NASA 실험을 다시 시도하고 있습니다.

  • 하드웨어와 운영 체제 (www.nccs.nasa.gov/dali_front.html)
  • 파이썬 버전이 다른 (2.5.3 대 3.3) 다른
  • 귀하의 MATLAB 버전 : 예를 들어, (2008 vs 2012)

NASA 결과가 정확하다고 가정 할 때 결과의 차이는 이러한 변경된 변수 중 하나 이상으로 인한 것입니다. 나는 당신을 추천한다 :

  • 미리 작성한 SciPy로 다시 테스트하십시오. binaries.
  • 이 계산 유형과 관련하여 MATLAB이 개선되었는지 조사합니다.

또한 this link이 유용 할 수 있습니다.

+0

처음에는 NASA 연구와 비교하려고했지만, Numpy가 2 배나 느려지 게 할 수있는 일이 있는지 (또는 명백한 것) 주로보고자했습니다. 그 대답이 MATLAB의 버전이 더 빨랐다면, 그게 전부 였을 것입니다. 그래도 고마워. – nicholls