cython 공부

리기지·2022년 11월 16일
post-thumbnail

최근 cython 공부를 시작하면서 .py .pyx .pyd 에 대해 정리 해본다.

.py : python 파일의 확장자
.pyx : cython 파일의 확장자
.pyd : .py or .pyx 를 cythonize 함수를 사용하여 변환시킨 window dll 파일

cython 을 사용하려는 이유는 대부분 속도의 이점을 얻기 위하거나, py source 코드를 숨기거나 등의 이유가 있을 것이다.

아래는 테스트 결과이다

pyd 로 변환시 속도가 확실히 빨라진다. 그냥 .py 를 .pyd 로 변환하는것 만으로도 2배정도의
속도가 빨라진다.

순수 python code

def primes(nb_primes):
    p = []
    n = 2
    while len(p) < nb_primes:
        # Is n prime?
        for i in p:
            if n % i == 0:
                break

        # If no break occurred in the loop
        else:
            p.append(n)
        n += 1
    return p

python + cython import

import cython

def primes(nb_primes: cython.int):
    i: cython.int
    p: cython.int[1000]

    if nb_primes > 1000:
        nb_primes = 1000

    if not cython.compiled:  # Only if regular Python is running
        p = [0] * 1000       # Make p work almost like a C array

    len_p: cython.int = 0  # The current number of elements in p.
    n: cython.int = 2
    while len_p < nb_primes:
        # Is n prime?
        for i in p[:len_p]:
            if n % i == 0:
                break

        # If no break occurred in the loop, we have a prime.
        else:
            p[len_p] = n
            len_p += 1
        n += 1

    # Let's copy the result into a Python list:
    result_as_list = [prime for prime in p[:len_p]]
    return result_as_list

pyx code

def primes(int nb_primes):
    cdef int n, i, len_p
    cdef int p[1000]

    if nb_primes > 1000:
        nb_primes = 1000

    len_p = 0
    n = 2

    while len_p < nb_primes:
        for i in p[:len_p]:
            if n % i == 0:
                break
        else:
            p[len_p] = n
            len_p += 1
        n += 1

    result_as_list = [prime for prime in p[:len_p]]
    return result_as_list

결론은 pyd 로 변환하면 속도가 확실히 빠르며, pyd 로 변환한다는 가정을 하면
1. python 코드의 cython 을 import 하여 변수를 선언하거나
2. pyx 로 작성을 하거나

해야 된다는 것이다.
만약 python + cython import 를 그냥 .py 로 실행하면 오히려 python 보다 느리다!!

0개의 댓글