파이썬으로 작성된 코드의 속도를 높이기 위해 어떤 도구 나 접근법을 사용할 수 있습니까?


29

배경 : MATLAB에서 Python으로 Krylov 하위 공간 방법을 사용하여 행렬 지수 벡터 제품을 계산하는 코드를 이식하고 싶을 수도 있습니다. (특히, 이 백서에 설명 된 알고리즘을 사용하는 Jitse Niesen의 expmvp 함수 ) 그러나 컴파일 된 라이브러리에서 파생 된 모듈에서 함수를 많이 사용하지 않는 한 (즉, 원시 Python 만 사용하고 많은 내장 된 것이 아니라) 기능에서), 그것은 매우 느릴 수 있습니다.

질문 : 성능 향상을 위해 Python으로 작성하는 코드의 속도를 높이는 데 도움이되는 도구 나 접근 방법은 무엇입니까? 특히 일반적인 접근 방식도 환영하지만 프로세스를 최대한 자동화하는 도구에 관심이 있습니다.

참고 : Jitse 알고리즘의 이전 버전이 있으며 한동안 사용하지 않았습니다. 이 코드를 빠르게 만드는 것은 매우 쉬울 수 있지만 좋은 예가 될 것이라고 생각했으며 내 연구와 관련이 있습니다. 파이썬 에서이 특정 알고리즘을 구현하기위한 나의 접근 방식을 논의하는 것은 전적으로 또 다른 질문입니다.


scicomp.stackexchange.com/questions/2429/… 이 질문에 대해 파이썬에 맞는 답변을주었습니다. 힌트와 링크가 도움이 될 것이라고 생각합니다.
AlexE

(이 사실을 알기 위해 @AlexE와 h / t)이 질문 사이에 겹치는 부분이 있습니다 . , 내 코드의 직렬 성능을 개선하기위한 좋은 전략은 무엇입니까? . 어떤 종류의 병합이 순서가 될 수 있습니다. 메타에 게시했습니다.
Geoff Oxberry 2016 년

1
여기에 좋은 답변 외에도이 링크를 살펴보십시오 .
Mike Dunlavey 2016 년

답변:


40

대답을 세 부분으로 나눕니다. 프로파일 링, c를 통한 파이썬 코드 속도 향상 및 파이썬을 통한 파이썬 속도 향상 파이썬에는 코드의 성능을 확인하고 실제 병목으로 드릴 다운하는 데 가장 적합한 도구가 있다고 생각합니다. 프로파일 링없이 코드 속도를 높이는 것은 uzi로 사슴을 죽이는 것과 같습니다.

mat-vec 제품에만 관심이 있다면 scipy.sparse를 추천 합니다 .

프로파일 링을위한 Python 도구

프로파일 및 cProfile 모듈 :이 모듈은 표준 런타임 분석 및 함수 호출 스택을 제공합니다. 통계를 저장하고 pstats 모듈을 사용하면 여러 가지 방법으로 데이터를 볼 수 있습니다.

kernprof :이 도구는 라인 별 코드 타이밍과 같은 작업을 수행하기위한 많은 루틴을 구성합니다.

memory_profiler :이 도구는 코드의 라인 단위 메모리 풋 프린트를 생성합니다.

IPython timers :이timeit함수는 함수의 차이점을 빠른 대화식 방식으로 보는 데 아주 좋습니다.

파이썬 속도 향상

Cython : Cython 은 파이썬에서 몇 가지 기능을 사용하고 더 빠른 코드를 얻는 가장 빠른 방법입니다. python의 cython 변형으로 함수를 장식하고 c 코드를 생성 할 수 있습니다. 이것은 매우 메인 테이블이며 c / c ++ / fortran에서 다른 손으로 작성한 코드에 쉽게 연결할 수 있습니다. 오늘날 가장 선호되는 도구입니다.

ctypes : ctypes를 사용하면 c로 함수를 작성한 다음 간단한 코드 장식으로 빠르게 래핑 할 수 있습니다. PyObjects에서 캐스팅하고 c 함수를 호출하기 위해 길을 관리하는 모든 고통을 처리합니다.

C로 코드를 작성하는 다른 방법이 있지만 C / C ++ 라이브러리를 파이썬으로 랩핑하는 데는 다소 더 큽니다.

파이썬 전용 접근법

파이썬 내부에 ​​머무르기를 원한다면 어떤 데이터를 사용하는지 알고 알고리즘을 구현하기 위해 올바른 데이터 유형을 선택하는 것이 좋습니다. 데이터 구조를 최적화 한 다음 저수준 c 핵을 최적화하면 일반적으로 훨씬 더 멀리 갈 수 있다는 것이 제 경험이었습니다. 예를 들면 다음과 같습니다.

numpy : 배열의 스트 라이딩 작업에 매우 빠른 연속 배열

numexpr : numpy 배열 표현식 최적화 프로그램. 다중 스레딩 numpy 배열 표현식을 허용하고 Python 인터프리터의 제한으로 인해 numpy가 만드는 수많은 임시 항목을 제거합니다.

blist : 목록의 b-tree 구현으로 목록의 내부 노드를 삽입, 색인 및 이동하는 데 매우 빠릅니다.

팬더 : 데이터 프레임 (또는 테이블) 어레이에서 매우 빠른 분석.

pytables : 빠른 구조적 계층 구조 테이블 (예 : hdf5). 특히 코어 계산 및 대용량 데이터 쿼리에 적합합니다.


3
ctype을 사용하여 포트란 루틴을 호출 할 수도 있습니다.
Matthew Emmett


코드 줄 바꿈에 대해 이야기하면 f2py는 어떻습니까?
astrojuanlu

f2py는 훌륭한 도구이며 커뮤니티의 많은 사람들이 사용합니다. fwrap은 f2py가 나이를 나타내지 만 실제로 완전하지는 않기 때문에 최신 대체품입니다.
aterrel

감사! 이것들은 내가 찾고있는 자원의 유형입니다. 나는 그들 중 일부만을 알고 있었고, 지나가는 (또는 인터넷에서 볼 때) 만 알고있었습니다. Aron은 계속해서 numexpr을 언급합니다. 어떻게 작동합니까? 그게 적용됩니까?
Geoff Oxberry

7

우선, C 또는 Fortran 구현이 가능하다면 (MATLAB MEX 함수?), 왜 파이썬 래퍼를 작성하지 않습니까?

래퍼뿐만 아니라 자체 구현을 원한다면 선형 대수에 numpy 모듈을 사용하는 것이 좋습니다. ATLAS, GOTOblas, uBLAS, Intel MKL 등과 같은 최적화 된 Blas에 연결되어 있는지 확인하십시오. 그리고 Cython을 사용하거나 직조하십시오. 좋은 소개와 벤치 마크를 보려면이 Performance Python 기사를 읽으십시오 . 이 문서의 다른 구현을 다운로드 할 수 있습니다 여기 트래비스 Oliphant (NumPy와-전문가)의 의례.

행운을 빕니다.


그 성능 Python 기사는 약간 오래된 것으로 보이지만 numexpr과 같은 새로운 도구 중 일부는 언급하지 않았습니다.
Aron Ahmadia 2016 년

나는 실제로 numexpr을 간과했다. numexpr을 사용하여 동일한 라플라스 벤치 마크를 실행하는 것이 좋을 것입니다 ...
GertVdE

되어 scipy.weave여전히 사용 및 개발? 성능 Python 기사는 사용이 빠르며 속도가 상당히 향상 된 것으로 보이지만 기사 외부에서 언급 한 경우는 거의 없습니다.
Ken

@ 켄 : scipy.weave는 내가 아는 한 더 이상 활발한 개발을하고 있지 않습니다. 이전 버전과의 호환성을 위해 유지되지만 새로운 프로젝트에서는 Cython을 사용하는 것이 좋습니다.
GertVdE


4

기본적으로 나는 다른 답변에 동의합니다. 빠른 숫자 python코드에 가장 적합한 옵션 은 다음과 같습니다.

  • 다음과 같은 특수 라이브러리를 사용하십시오. numpy
  • - python프로그램이 직접 호출 할 수 있도록 기존 코드를 래핑하십시오.

그러나 전체 알고리즘을 처음부터 프로그래밍하려면 (나는 "원시 Python 만 사용") http://pypy.org/ 의 JIT (Just In Time) 구현 을 고려할 수 있습니다 python. 내 프로젝트에 사용할 수 없었습니다 (의지 numpy하고 pypy사람들이 그것을 지원하기 위해 현재 노력 하고 있기 때문에 ). 그러나 벤치 마크는 상당히 인상적입니다 ( http://speed.pypy.org/ )


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