맨위로가기

사이썬

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

사이썬은 파이썬 코드를 C 언어로 컴파일하여 실행 속도를 향상시키는 프로그래밍 언어이다. 파이썬의 느린 실행 속도 문제를 해결하기 위해 개발되었으며, C 언어와 유사한 형태로 함수의 인자와 변수 타입을 선언하여 C 코드 호출을 용이하게 한다. 사이썬은 파이썬 C API와 연동되며, C/C++ 코드와의 연결도 지원한다. 과학 계산, 데이터 분석, 웹 개발 등 다양한 분야에서 활용되며, SageMath, SciPy, pandas, scikit-learn과 같은 라이브러리에서 사용된다.

더 읽어볼만한 페이지

  • 파이썬 구현 - 스택리스 파이썬
    스택리스 파이썬은 파이썬 인터프리터 내에서 마이크로 스레드를 이용해 프로그램 실행을 관리하는 그린 스레드 형태로서, 이벤트 기반 비동기 프로그래밍의 대안으로 사용되며, CPython의 GIL로 병렬 처리는 불가하지만 greenlet을 통해 그린 스레딩 솔루션을 제공한다.
  • 파이썬 구현 - PyPy
    PyPy는 파이썬의 호환 가능하고 빠른 구현을 목표로 하는 동적 언어 구현 프레임워크이며, RPython을 사용하여 JIT 컴파일러를 생성하고, Python 2.7과 3.10 버전을 지원한다.
  • 소스 대 소스 컴파일러 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 소스 대 소스 컴파일러 - 타입스크립트
    타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다.
  • 아파치 라이선스 소프트웨어 - 안드로이드 (운영체제)
    구글이 개발한 리눅스 커널 기반의 모바일 운영체제인 안드로이드는 오픈소스 플랫폼으로 다양한 기기에서 활용되며 세계적으로 널리 사용되지만, 개인정보 보호 문제와 독점적 지위 남용 논란 등의 비판도 존재한다.
  • 아파치 라이선스 소프트웨어 - 쿠버네티스
    쿠버네티스는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링, 관리하는 오픈 소스 시스템으로, 구글의 Borg 시스템에서 영감을 받아 설계되었으며 파드, 서비스 등의 기능을 제공하여 클라우드 네이티브 환경에서 중요한 역할을 한다.
사이썬 - [IT 관련 정보]에 관한 문서
기본 정보
Cython 로고
Cython 로고
개발자Robert Bradshaw, Stefan Behnel 등
출시일2007년 7월 28일
라이선스Apache License 2.0
프로그래밍 언어Python (파이썬)
영향을 받은 언어C (C 언어), Python (파이썬)
운영 체제Windows (윈도우), macOS, Linux (리눅스)
파일 확장자.pyx, .pxd, .pxi
웹사이트공식 웹사이트

2. 역사

사이썬은 파이랙스(Pyrex) 프로젝트에서 분기되어 발전했다. 파이렉스는 파이썬 소스 코드를 컴파일하기 위한 초기 프로젝트였다.[15][16] 사이썬은 세이지(Sage) 프로젝트 내부에서 파이렉스를 고도화하기 위해 개발되었으나, 사이썬 자체에 대한 관심도가 높아짐에 따라 별도의 프로젝트로 분리되었다. 초기에는 소스 코드 컴파일을 통해 계산용 환경인 세이지의 수행 속도를 향상시키기 위해 사용되었으며, 컴파일러 내부 명칭은 세이지-엑스(Sage-X)였다. 세이지 개발자들은 파이썬 컴파일러를 사용하기 위한 목적으로 세이지를 다운로드하는 횟수가 급증하자 이를 별도의 프로젝트로 만들었다. 세이지에서 분리된 후 파이랙스 개발자들과 공동으로 프로젝트가 진행되면서 현재의 사이썬이라는 명칭으로 불리게 되었다.[17]

3. 원리

사이썬은 파이썬 코드를 C 언어로 컴파일하여 실행 속도를 향상시킨다. C 언어로 작성된 코드를 호출하는 데 드는 노력이 적고, 호출 속도가 빠르다. 파이썬에서 C 언어 코드를 호출하기 위해 필요한 변수 전달 및 결과 수신 코드를 사이썬이 자동으로 처리한다.[7]

사이썬 함수 호출은 C 함수 호출과 유사하며, 외부 파이썬 코드를 통한 호출이 필요 없는 경우 C와 같은 형태로 컴파일하여 고속 호출이 가능하다. 외부 파이썬 코드가 호출하는 함수의 경우, 파이썬 형태로 동작하도록 컴파일하는 기능이 포함되어 있다.[7]

사이썬은 C/C++ 서브루틴을 호출하기 위한 외부 함수 인터페이스와 서브루틴 매개변수 및 결과, 지역 변수 및 클래스 속성의 정적 타입을 선언하는 기능을 가지고 있다.

CPython과 사이썬 실행 모델의 차이로 인해, 동일한 알고리즘을 구현하는 사이썬 프로그램은 해당 파이썬 프로그램보다 코어 메모리 및 처리 사이클과 같은 컴퓨팅 리소스를 덜 소비할 수 있다. 기본적인 파이썬 프로그램은 CPython 가상 머신에 의해 로드되고 실행되므로 런타임과 프로그램 자체가 컴퓨팅 리소스를 소비한다. 사이썬 프로그램은 C 코드로 컴파일되고, 다시 기계어로 컴파일되므로 가상 머신은 프로그램이 로드될 때만 잠시 사용된다.[8][9][10][11]

사이썬은 다음을 사용한다.[12][13]


  • 낙관적 최적화
  • 타입 추론 (선택 사항)
  • 제어 구조의 낮은 오버헤드
  • 낮은 함수 호출 오버헤드


성능은 사이썬이 생성하는 C 코드와 해당 코드가 C 컴파일러에 의해 컴파일되는 방식 모두에 달려 있다.[14]

4. 도입 배경

파이썬스크립트 언어로서 소스 코드를 실시간으로 해석하여 실행하기 때문에 C언어와 같은 컴파일러 언어에 비해 실행 속도가 느리다. 컴파일러 언어는 소스 코드를 미리 번역해 둔 실행 파일을 수행하므로 실시간 코드 해석이 필요 없어 실행 속도가 빠르다. 파이썬은 동적 프로그래밍 언어 형태를 따르기 때문에 변수 타입을 동적으로 변경하며, 이로 인해 변수 타입 확인 과정이 필요하다. 이는 반복문에서 시간 손실을 증가시킨다.[7]

사이썬은 이러한 파이썬의 실시간 코드 해석 특성과 동적 변수 특성으로 인한 실행 속도 한계를 극복하기 위해 개발되었다. 사이썬은 파이썬 스크립트를 C언어로 컴파일하고, 정적 타입 선언 기능을 제공한다. 이를 통해 반복문 사용 시 파이썬에 비해 수십에서 수백 배까지 실행 속도를 향상시킬 수 있다.[7]

5. 문법

사이썬은 함수의 인자와 함수 내 변수 타입을 C와 유사하게 선언할 수 있으며, `.pyx` 확장자를 사용한다. 사이썬으로 작성된 파일은 컴파일 후 파이썬에서 `import`하여 사용할 수 있다.[15][16]

사이썬 "Hello World"

5. 1. 사이썬 파일

사이썬 파일은 `.pyx` 확장자를 가지며, 함수 인자와 변수 타입을 C 언어와 유사하게 선언하여 파이썬에서 `import`하여 사용할 수 있도록 한다.[15][16]

표준 파이썬은 동적 타이핑을 사용하지만, 사이썬은 선택적으로 타입을 지정하여 성능을 높이고 루프를 C 루프로 변환할 수 있다.

```cython

# 인수는 int로 변환되거나 TypeError를 발생시킵니다.

def primes(int kmax):

# 이러한 변수는 C 타입으로 선언됩니다.

cdef int n, k, i

# 다른 C 타입

cdef int p[1000]

# 파이썬 타입

result = []

if kmax > 1000:

kmax = 1000

k = 0

n = 2

while k < kmax:

i = 0

while i < k and n % p[i] != 0:

i = i + 1

if i == k:

p[k] = n

k = k + 1

result.append(n)

n = n + 1

return result

5. 1. 1. 사이썬 자체 코드

cython

# Define a mathematical function with type definitions

def inverse(float x):

cdef float y

y = 1.0 / x

return y

```

위 `mathx.pyx`에 있는 `inverse()` 함수처럼 입력 인자의 변수를 `float` 타입으로 한정한다. 내부 변수 `y`도 `float` 타입으로 한정하여, 변수 연산 시 매번 타입을 확인하는 과정을 생략해 속도를 높인다.[15][16]

5. 1. 2. 파이썬 라이브러리 호출

cython

# Use python standard library, which is log() in math

import math

def kmc(float x):

cdef float t

t = math.log(x)

return t

```

사이썬은 파이썬 기본 라이브러리를 `import`하여 사용할 수 있다. (예: `import math`) 위 코드는 `scix.pyx` 사이썬 파일로 파이썬에서 제공하는 기본 라이브러리를 사용하는 예시이다. C-API를 이용하는 경우와 달리, 사이썬은 파이썬 함수 호출을 위한 추가 코드 작성을 자동화한다.

5. 1. 3. 넘파이(Numpy)를 사용하는 사이썬

넘파이(Numpy)는 수치 행렬을 효과적으로 사용하도록 하는 파이썬 라이브러리이다. 사이썬은 넘파이를 사용할 때 최적화할 수 있는 방법을 제공한다. 넘파이를 사용하는 경우, 효과적인 C 언어로 변환하기 위해 사이썬 파일에는 다음과 같은 선언이 필요하다.

```cython

# Use python standard library, which is log() in math

import numpy as np

cimport numpy as np

def cython_func(np.ndarray[np.uint32, ndim=1] H, np.ndarray[np.float64_t, ndim=2] X):

5. 2. 사이썬 컴파일

사이썬 파일 컴파일을 위해서는 `setup.py` 파이썬 스크립트가 필요하다.[17] 와일드카드(*)를 사용하여 동일 디렉토리 내 모든 사이썬 파일들을 한 번에 컴파일할 수 있다.

```python

from distutils.core import setup

from Cython.Build import cythonize

setup(name = 'Cython Library',

ext_modules = cythonize("*.pyx"))

```

커맨드 라인에서 `setup.py`를 이용하여 컴파일하는 방법은 다음과 같다.

```bash

python setup.py build_ext --inplace

5. 3. 사이썬 함수의 사용

파이썬 커맨드 라인에서 컴파일된 `mathx.pyx`와 `scix.py` 내부의 함수를 실행하는 방법은 다음과 같다.



>>> import mathx, scix

>>> mathx.inverse(3.0)

>>> scix.kmc(5.0)



6. C/C++ 파일과 연결

사이썬은 C/C++로 작성된 코드와 쉽게 연결할 수 있다는 장점이 있다.

6. 1. C 파일과 연결

사이썬은 외부 C 코드를 호출하는 방법을 제공하며, C 데이터 타입을 처리할 수 있는 기능을 통해 C 라이브러리와의 상호 작용을 쉽게 만든다.

6. 2. C++ 파일과 연결

사이썬 코드에 `c++` 사용을 요청하려면, 코드 상단에 `# distutils: language = c++`를 추가해야 한다. 이렇게 하면 `setup.py`는 변경 없이 사용할 수 있다. C++ 코드와 사이썬 코드를 연결하려면 `.pxd` 파일이 필요하다.

다음은 `MyCPP.pxd` 파일을 통해 C++로 작성된 `mysort` 함수를 가져와 사용하는 예시이다.

```cython

# distutils: language = c++

from MyCPP cimport mysort

def main():

mysort()

```

`MyCPP.pxd` 파일은 다음과 같이 C++ 코드 (`MyCPP.cpp`, `MyCPP.h`)를 사이썬에 연결한다.

```cython

cdef extern from "MyCPP.cpp":

pass

cdef extern from "MyCPP.h" namespace "mycpp":

void mysort()

```

첫 줄은 `MyCPP.cpp`를 사용한다는 의미이며, 이를 통해 자동 컴파일이 이루어지므로 `setup.py`에 C++ 컴파일 코드를 추가할 필요가 없다.

C++ 연결에 대한 자세한 내용은 사이썬 메뉴얼의 [https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html C++ 래핑 부분]을 참조하면 된다.

7. 장점

사이썬은 C 함수를 파이썬 문법에서 호출할 수 있도록 하며, 부가 코드 작성 없이 바로 호출 가능하다는 장점이 있다. 예를 들어, 일반적인 Python-C-API 방식을 이용하는 경우에는 래핑(wrapping) 코드를 별도로 작성해야 한다. SWIG를 이용하면 이러한 과정을 자동화할 수 있지만, SWIG를 통해 부가 코드를 생성하는 과정이 필요하다는 불편함이 여전히 존재한다.

사이썬은 C 함수를 직접 호출하여 실행 시간을 단축할 수 있다. 다음은 C 함수를 직접 호출하는 예시이다.

```cython

cdef extern from "math.h":

double log(double x)

def kmc(float x):

cdef float t

t = log(x)

return t

```

`cdef extern from "math.h"`를 통해 C 라이브러리인 `math.h`를 불러오도록 설정하여 C 함수를 직접 호출하는 형태가 된다. 이때 C언어에서 직접 부른 함수는 라이브러리 명칭을 생략하고 `log()`와 같이 직접 적는다.

함수의 타입을 컴파일 시점에 미리 정해두면 실행 시점에서 타입을 검사하는 시간을 생략할 수 있어 시간 이득을 볼 수 있다. 다음은 `ipython` 환경에서 매직 함수인 `timeit`을 통해 수행 시간을 측정한 예시이다.

```python

In [1]: %timeit scix.kmc(10.0)

1000000 loops, best of 3: 249 ns per loop

In [2]: %timeit scix_c.kmc(10.0)

10000000 loops, best of 3: 142 ns per loop

```

C언어 함수를 직접 호출한 `scix_c.kmc`가 더 빠르게 실행되는 것을 확인할 수 있다.

8. 디자인

사이썬은 표준 파이썬 모듈을 생성하여 작동하지만, 모듈 코드가 C로 번역된다는 점에서 표준 파이썬과 다르다.[7] CPython 인터프리터와 CPython 표준 라이브러리를 많이 호출하여 개발 시간을 절약했지만, 의존성이 존재한다.[7] 대부분의 코드는 C 기반이지만, 작은 스텁 로더가 필요하다.[7]

사이썬은 C/C++ 서브루틴을 호출하기 위한 외부 함수 인터페이스와 서브루틴 매개변수 및 결과, 지역 변수 및 클래스 속성의 정적 타입을 선언하는 기능을 가지고 있다.

CPython과 사이썬 실행 모델의 차이로 인해, 사이썬 프로그램은 컴퓨팅 리소스를 덜 소비할 수 있다.[8][9][10][11] 사이썬은 다음을 사용한다.


  • 낙관적 최적화
  • 타입 추론 (선택 사항)
  • 제어 구조의 낮은 오버헤드
  • 낮은 함수 호출 오버헤드[12][13]

9. 활용

사이썬은 특히 파이썬 과학 사용자들 사이에서 인기가 많으며,[10][19][20] 파이썬 창시자인 귀도 반 로섬에 따르면 "완벽한 대상"을 가지고 있다.[21]


  • 자유 소프트웨어 SageMath 컴퓨터 대수 시스템은 성능 향상과 다른 라이브러리와의 인터페이스를 위해 사이썬에 의존한다.[22]
  • 과학 컴퓨팅 라이브러리 SciPy, 판다스 및 scikit-learn의 상당 부분이 사이썬으로 작성되었다.[23][24]
  • Quora와 같이 트래픽이 많은 일부 웹사이트에서 사이썬을 사용한다.[25]


사이썬의 영역은 수치 계산에만 국한되지 않는다. 예를 들어, lxml XML 툴킷은 대부분 사이썬으로 작성되었으며, 이전 버전인 Pyrex와 마찬가지로 사이썬은 메시징 라이브러리인 ZeroMQ와 같은 많은 C 및 C++ 라이브러리에 대한 파이썬 바인딩을 제공하는 데 사용된다.[26] 사이썬은 또한 멀티 코어 프로세서 머신을 위한 병렬 프로그래밍을 개발하는 데 사용할 수 있으며, 이 기능은 OpenMP 라이브러리를 활용한다.

10. 스크립트 컴파일러

Julia는 Matlab 문법을 가진 수치 계산용 컴파일러 언어이고, Go는 C언어로 컴파일이 가능한 시스템 언어이고, CoffeeScript는 JavaScript로 컴파일되는 웹 언어이다.

참조

[1] 웹사이트 The Cython Compiler for C-Extensions in Python http://www.behnel.de[...] Vilnius/Lietuva 2008
[2] 웹사이트 Language Basics — Cython 3.0.0a9 documentation https://cython.readt[...] 2021-09-09
[3] 웹사이트 Cython - an overview — Cython 0.19.1 documentation http://docs.cython.o[...] Docs.cython.org 2013-07-21
[4] 서적 Cython: A Guide for Python Programmers http://shop.oreilly.[...] O'Reilly Media 2015
[5] 웹사이트 FAQ · cython/cython Wiki https://github.com/c[...] 2023-01-11
[6] 웹사이트 Cython Changelog https://cython.readt[...] 2023-07-21
[7] 웹사이트 Basic Tutorial — Cython 3.0a6 documentation https://cython.readt[...] 2020-12-11
[8] 웹사이트 Technical Discovery: Speeding up Python (NumPy, Cython, and Weave) http://technicaldisc[...] Technicaldiscovery.blogspot.com 2013-07-21
[9] 간행물 Cython: The Best of Both Worlds http://research.goog[...]
[10] 간행물 Fast numerical computations with Cython http://conference.sc[...]
[11] 간행물 Using Cython to Speed up Numerical Python Programs http://simula.no/res[...] 2011-06-14
[12] 웹사이트 wrapper benchmarks for several Python wrapper generators (except Cython) http://telecom.inesc[...] 2010-05-28
[13] 웹사이트 wrapper benchmarks for Cython, Boost.Python and PyBindGen http://behnel.de/cyc[...] 2010-05-28
[14] 웹사이트 Cython: C-Extensions for Python http://cython.org/in[...] 2015-11-22
[15] 웹사이트 Differences between Cython and Pyrex https://github.com/c[...]
[16] 웹사이트 Re: VM and Language summit info for those not at Pycon (and those that are!) http://mail.python.o[...] 2011-05-05
[17] 웹사이트 Cython: Past, Present and Future https://www.youtube.[...] 2011-05-05
[18] 웹사이트 Building Cython code https://cython.readt[...] 2017-04-24
[19] 웹사이트 inSCIght: The Scientific Computing Podcast http://inscight.org/[...] 2011-05-29
[20] 간행물 Python for Scientists and Engineers https://escholarship[...]
[21] 웹사이트 Re: VM and Language summit info for those not at Pycon (and those that are!) http://mail.python.o[...] 2011-05-05
[22] 서적 Mathematical Software – ICMS 2010 http://wstein.org/pa[...] Springer Berlin / Heidelberg
[23] 웹사이트 SciPy 0.7.2 release notes http://docs.scipy.or[...] 2011-05-29
[24] 간행물 Scikit-learn: Machine Learning in Python
[25] 웹사이트 Is Quora still running on PyPy? https://www.quora.co[...]
[26] 웹사이트 ØMQ: Python binding http://www.zeromq.or[...]
[27] 문서 https://github.com/c[...]
[28] 웹인용 The Cython Compiler for C-Extensions in Python http://www.behnel.de[...] Vilnius/Lietuva 2008
[29] 웹인용 Language Basics — Cython 3.0.0a9 documentation https://cython.readt[...] 2021-09-09



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com