2012-03-31 5 views
3

MATLAB 및 NumPy에서 EIG 기능을 프로파일 링하여 Macbook Pro (2GHz, Quad core i7 OS X 10.6 실행)의 성능을 비교해 보았습니다. NumPy EIG는 MATLAB에 비해 상당히 느린 것으로 보입니다. NumPy와 주위 19.5 초/간부있어Numpy EIG는 Mac OS X 10.6에서 MATLAB EIG보다 약 4 배 느립니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

s = '''\ 
x = numpy.random.random((2000,2000)); 
numpy.linalg.eig(x); 
''' 
t = timeit.Timer(stmt=s,setup="import numpy") 
result = t.repeat(repeat=5,number=10) 
result 
Out[22]: 
[197.1737039089203, 
197.34872913360596, 
196.8160741329193, 
197.94081807136536, 
194.5740351676941] 

:

는 여기에 내가 NumPy와에 프로파일 코드입니다.

여기 MATLAB에서 동일한 코드이다 :

clear all 
tic; 
for i = 1:50 
    x = rand(2000,2000); 
    eig(x); 
end 
toc; 
Elapsed time is 267.976645 seconds. 

MATLAB에 주위 5.36 초/간부 있다고.

이것은 JIT 성능에 크게 의존해서는 안되는 것처럼 간단합니다. BLAS 라이브러리와 BLAS 라이브러리에 액세스하는 루틴으로 요약 할 수 있습니다. MATLAB은 Mac에서 Accelerate Framework를 사용합니다.

NumPy도 Macbook Pro에서 Accelerate Framework BLAS를 사용하는 것처럼 보입니다. 여기

그래서 여기에 NumPy와의 사람에 대한 내 질문 (모두 MacPorts를에서 설치) numpy.show_config()

numpy.show_config() 
lapack_opt_info: 
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate'] 
    extra_compile_args = ['-msse3'] 
    define_macros = [('NO_ATLAS_INFO', 3)] 
blas_opt_info: 
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate'] 
    extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers'] 
    define_macros = [('NO_ATLAS_INFO', 3)] 

내가 파이썬 2.7.2와 NumPy와 1.6을 사용하고 출력입니다 : 왜 NumPy와이 인스턴스에 느린 ? NumPy를 설치하는 동안 최적화를 생략 했습니까?

답변

5

내가 아는 한, MATLAB은 Accelerate Framework가 아닌 BLAS로 MKL 라이브러리를 사용합니다. 내 경험에 따르면 Accelerate는 MKL보다 상당히 느립니다. 이를 확인하기 위해 Numpy가 MKL에 대해 컴파일 된 Enthought Python Distribution (EPD)의 학술적 버전을 얻고 이러한 시간을 비교해 볼 수 있습니다. 또한 기본적으로 MATLAB은 모든 스레드 (단일 스레드 모드로 실행 해보십시오) 인 을 사용하지만 Numpy는 그렇지 않습니다. EPD에서 이, 그것은 내가 그 권리를 읽고 있어요 경우

import mkl 
mkl.set_num_threads(4) 
+0

또한, r.e. 아니. NumPy와 MATLAB은 모두 EIG를 실행할 때 내 컴퓨터에서 사용할 수있는 4 개의 코어를 모두 사용합니다. 그러나 NumPy가 실행 중일 때로드는 MATLAB이 실행될 때보 다 조금 더 낮습니다 (아직 정량화되지 않았습니다). – KartMan

2

를 실행하여 수행 할 수 있습니다, 당신은 EIG 기능에 추가하여 난수 생성기의 성능을 프로파일 링하고 있습니다. 저는 실수로 GAUSS를 MATLAB과 비교해 보았습니다. 당신이 얻은 것을 볼 때 난수 생성을 다시 고려할 것입니다.

다른 한 주 - 당신은 당신의 NumPy와 배열이 내부적으로 포트란 순서로 저장되어 있는지 확인하면 LAPACK/BLAS 물건의 일부는, 당신은 더 나은 성능을 GT는 수를 위해 :

In [12]: x = numpy.random.random((200,200)) 

In [13]: x.flags 
Out[13]: 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : False 
    OWNDATA : True 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 


In [15]: x = numpy.array(x, order="F") 

In [16]: x.flags 
Out[16]: 
    C_CONTIGUOUS : False 
    F_CONTIGUOUS : True 
    OWNDATA : True 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 

크리스

+0

맞아. 맞아.하지만 NumPy와 MATLAB에서 무작위 배열을 생성하는 데 걸린 시간을 따로 따로 비교하려고했는데,이 크기의 배열에 대해서는 EIG와 거의 비슷하고 무시할 만하다. 코드를 프로파일 링 할 수있다. 그것이 대부분의 시간을 보내는 곳을보기 위해! – KartMan

+0

배열을 Fortran 순서로 변경해도 EIG에 도움이되지 않았습니다. EIG를 호출하기 전에'x = x.T '를 사용할 수 있습니다. – KartMan

1

큰 차이는 MATLAB에서 고유 값만을 계산하지만 파이썬/numpy에서는 고유 값과 고유 벡터를 모두 계산하기 때문입니다. 이를 수정하고 적절한 비교를하려면 다음 중 하나를 수행해야합니다. 1. numpy.linalg.eig (x)를 numpy.linalg.eigvals (x)로 변경하고 matlab 코드를 그대로 두십시오. 2.matlab에서 eig (x)를 [V, D] = eig (x)로 변경하고 python/numpy 코드를 그대로 둡니다 (matlab 스크립트에서 더 많은 메모리를 사용할 수 있습니다) 내 경험에 비하면 python/numpy는 MKL로 최적화되었습니다. (나는 윈도우를 사용하는데 acclerate 프레임 워크에 대해 많이 모른다) MKL로 최적화 된 matlab보다 빠르거나 빠릅니다.