깊지 않은 Cython 시작

7283 단어 CythonPython

Cython이란?


파이톤의 처리 속도는 결코 빠르지 않고 느린 종류이다.
따라서 Cython은 C/C++로 변환하여 고속화를 시도합니다.
저급 언어의 C/C++ (이전에는 고급 언어였는데 지금은 저급 언어라고 할 수 있다) 를 로컬 언어로 바꾸기 때문에 속도가 틀림없이 매우 빠를 것이다.

이 문장의 목적


'Cython은 어렵다','Cython은 C/C++ 지식이 필요하다'는 인상을 준다.정답은 "Yes"입니다.
그러나 이 대답의 전제는 Cython을 충분히 이용해야 한다는 것이다.
실제로 Cython의 디자인은 C/C++를 잘 모르더라도 약간의 고속화에 충분한 이점을 줄 수 있다는 것이다.
하지만 씨톤을 마구 써도'별로 고속화하지 않는다','옮기기가 매우 어렵다'등 다양한 결과가 나오겠죠.이를 바탕으로 본 보도의 목적은 C/C++를 잘 모르는 초보자도 Cython의 음식을 먹을 수 있도록 하는 것이다.

이 문장에서 설명하지 마라


또한 이 글에서 Cython의 설치 방법, setup.py등의 문법을 설명하지 마라.Google에서 검색하면 바로 나올 것입니다. 검색하십시오.
Cython을 Windows에서도 사용할 수 있습니다.
이 글에는 씨탄의 깊은 부분을 건드리지 않고 맛있는 곳을 먹기 위해 씨탄의 깊은 부분을 설명하지 않았다.다행히도, Cython의 문서가 번역된, Cython의 깊은 부분을 알고 싶으면 아래의 글을 참고하십시오.
Cython 문서 (및 번역)

Cython에서 고속화되지 않는 게 좋을 것 같아요.


처리 속도가 빠르다고 해서 함부로 고속화해서는 안 되고, 오히려 씨텐이 고속화하면 효과가 나오는 곳이 적다고 할 수 있다.

CPU 점프 이외의 부분을 고속화하다


프로그램의 실행 속도는 결코 간단한 처리 속도에 의해 결정되는 것이 아니다.
처리 속도 향상으로 개선할 수 있는 것은 연산 처리가 많은 대기(CPU 점프)뿐이며, 메모리 접근 대기(메모리 점프), HDD 등의 데이터 읽기 대기(I/O 점프) 등에는 거의 효과가 없다.
이런 문제들은 알고리즘(예를 들어 필기), 라인/다중 프로세스 개선을 통해 해결해야 한다.

프로그램을 모두 고속화하다


Cython의 고속화는 C/C++로 이식하는 것보다 간단하지만 부담이 필요하다.
프로그램 전체를 고속화하느라 고생해도 무의미한 일이 많다.
1회로만 불리는 함수를 10% 고속화하기보다는 1천회로 불리는 함수를 1% 고속화해 효율성을 높인다.

즉, 고속화해야 할 곳은 전체의 일부분에 불과하다는 것이다


상술한 두 가지는 고속화의 대원칙과 상식이다.
중요한 것은 전체 프로그램을 고속화하는 것이 아니라 병목이 되는 원인과 장소를 이해하고 적절하게 대응하는 것이다.
반대로 말하자면 언어의 처리 속도는 그리 중요하지 않고 알고리즘의 개선이 상당히 중요하다. 집행 속도의 문제는 기본적으로 알고리즘의 개선을 통해 해결할 수 있다.
병목 현상의 원인에 따라 SWIG와 넘바에 적합한 경우가 있어 적절한 장소에서 분리해서 사용할 수 있다.
  • SWIG
  • 파이톤에서 기존 C/C++ 라이브러리를 호출하는 도구
  • Numba
  • Jit컴파일러를 통해 병목을 측정하고 병목, 병목의 범위가 넓거나 동적 변화를 최적화할 때 유효
  • Cython을 통한 코드 개선


    순환 처리


    파이톤의 순환 처리는 매우 느리다.
    어레이에 다양한 유형의 자유도를 저장할 수 있기 때문에 순환할 때 다양한 검사가 가능하다.
    고속 Numpy를 사용하더라도 for로 패턴을 회전하면 속도가 현저히 떨어지고 Numpy를 사용할 때 순환 처리가 철이 되는 것을 피한다.

    운산


    동적 유형 언어의 자유도 때문에 모든 연산에는 변수의 유형 검사가 있다.a + b처럼 간단한 연산도 __add__ 방법을 거쳐야 하기 때문에 모든 연산에 비용이 발생한다.

    함수 호출


    파이톤에 국한되지 않지만 함수 호출은 큰 비용을 발생시킬 수 있습니다.
    특히 동적 유형 언어는 창고에 대입할 때도 유형 검사를 하기 때문에 정적 유형 언어보다 비용이 많이 든다.

    IPython으로 시작하는 Cython


    Cython을 실현하려면 Jupyter가 가장 좋다.Cython은 Jupyter의 magick command에 대응하여 Jupyter에서 쉽게 시도할 수 있습니다.
    Jupyter에서 다음 명령을 사용하여 Cython을 유효하게 만듭니다.
    %load_ext Cython
    
    모두 함께 가장 좋아하는 피보나치 수의 실험을 해보자.
    우선, 파이토존에서 피보나치 수를 얻는 파이톤 함수를 제작한다.
    def py_fib(n):
        a, b = 0.0, 1.0
        for i in range(n):
            a, b = a + b, a
        return a
    
    속도 측정
    %timeit py_fib(1000)
    >>> 10000 loops, best of 3: 66.9 µs per loop
    
    이어 마술 지령%%cython과 시작하여 아까의 파이톤 함수 내용과 똑같은 함수를 만들어 보았다.반복해서 말하면 함수 이름만 다르고 내용은 파이톤과 완전히 같다.
    %%cython
    def cy_fib(n):
        a, b = 0.0, 1.0
        for i in range(n):
            a, b = a + b, a
        return a
    
    속도 측정
    %timeit cy_fib(1000)
    >>> 100000 loops, best of 3: 16 µs per loop
    
    파이썬 함수만 씨썬으로 설정하면 66.9μs→16μs로 아무것도 하지 않았는데 4배 이상 빨라졌다.
    Cython은 Python과 문법 호환성이 상당히 높아서, 너무 특수한 Python 코드가 아니라면 Cython은 바로 C/C++로 변환됩니다.
    더욱 고속화하기 위해 모델을 지정해 보세요.
    %%cython
    def cy_fib2(int n):
        a, b = 0.0, 1.0
        for i in range(n):
            a, b = a + b, a
        return a
    
    속도 측정
    %timeit cy_fib2(1000)
    >>> 1000000 loops, best of 3: 1.11 µs per loop
    
    66.9μs→1.11μs로 속도가 60배 높아진다.
    여기서 중요한 것은 def cy_fin2(int n)의 부분만 유형 정의를 했고 이외에 파이톤 함수와 완전히 같다는 것이다.
    사실 Cython은 형 추론을 진행했는데 변수a,b는 자동으로 더블형으로, 변수i는 자동으로 int형으로 바뀌었다.파이썬 코드를 직접 붙여넣더라도 최대한 C/C++로 변환해 파이썬의 원래 코드와 같은 동작을 피하고 성능을 해친다.
    Cython에서 종류를 함부로 지정하는 것은 가독성을 떨어뜨릴 뿐 큰 의미가 없다. 대부분의 경우 몇 개의 변수를 정의하기만 하면 수십 배의 고속화를 이룰 수 있다.%%cython -a 를 실행하면, 파이톤과 C/C++는 처리에 걸린 줄을 노란색으로 표시합니다.

    우선, 아무 생각 없이 파이썬 코드를 복사하고 노란색 줄을 우선적으로 지정하는 것이 정당한 파이썬 사용법이죠.

    총결산


    한 마디로 하면 고속화에서 최적화해야 할 부분은 프로그램 코드의 일부 함수이고 이 함수에서 Cython에서 최적화해야 할 줄은 극히 적다.
    따라서 가독성을 유지하고 목표를 가볍게 달성하는 것이 Cython이다.
    일반적으로 Cython은 어렵다고 생각하지만, Cython 개발자의 노력으로 Cython은 거의 완벽한 Python과 호환성을 갖추게 되었다.부분적으로 고속화하면 C/C++를 몰라도 충분히 은혜를 받을 수 있다.
    (99%의 경우 몇 개의 함수만 가속화하면 목적을 달성할 수 있다)
    Cython은 매우 심오하여 사용법을 더 설명할 기회가 있다.
    이어서Cython 깊이 들어가지 않음 - 2 -.

    좋은 웹페이지 즐겨찾기