pypy나 cython를 윈도우상에서 실행시키는법을 알고싶습니다.

조회수 6455회

윈도우 환경에서 아나콘다3 (python 3.6)버전을 설치해서 작업중에 있습니다.

파이썬 언어자체가 간편해서 소스작성자체는 어렵지 않은데 소스가 약간만 길어지면 엑셀보다도 속도가 느려짐을 느꼈습니다.

파이썬 속도개선을 위해 찾아보니 cython과 pypy 같은 방법이 있더군요.

해당 유틸리티?의 활용법을 알고싶습니다.

http://pypy.org/download.html#default-with-a-jit-compiler

위의 주소는 cython보다 빠르다는 pypy 를 받을수 있는 사이트입니다.

하지만 아직 python3.6 윈도우용 바이너리가 만들어지지 않아서 가상머신(VM VirtualBox)를 설치하고 우분투도 깔아보고 있는상황입니다.

대다수의 파이썬 라이브러리나 소스가 우분투내에서 설치해야 되더군요.

지금 하고있는 가상머진내에서의 우분투를 통한 설치가 윈도우내에서도 적용되는지 역시 궁금합니다.

질문을 정리하자면 파이썬의 느린속도를 개선하기 위한 방법을 찾고있습니다.

방법에 대한 답변과 해당답변에 대한 방법까지 알고싶습니다. 조언 부탁드립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • pypy 는 jit 컴파일러가 내장되어 있어 바이너리 코드로 컴파일이 되어 그 결과물을 실행합니다. 즉 바이너리 코드를 실행하므로 당연히 성능이 좋습니다.

    cython은 c 코드 transpiler로 cython 으로 transpile된 결과물은 c코드입니다. 그렇게 만들어진 c 코드는 c확장모듈용 코드이므로 c컴파일러를 통해 pyd 를 생성하여 파이썬에서 사용합니다. 당연히 c 코드이므로 성능이 좋습니다.

    pypy는 python 과 호환성이 있으므로 python 코드를 그대로 사용할 수 있다는 장점이 있습니다.

    cython 은 기존의 c코드를 그대로 통합하여 사용할 수 있는 장점과 c확장모듈을 python 형식으로 작성할 수 있다는 장점이 있습니다.

    쉽게 성능만 개선해야 한다면 pypy가 손쉽긴 합니다만 아무래도 최적화의 한계가 있는 편입니다.

    반면에 cython 은 c 컴파일러를 사용해야 하므로 러닝커브가 제법 됩니다만 c코드를 그대로 사용할 수 있어서 최적화를 극대화 할 수 있습니다.

    • 성능이 좋다는 사실은 익히 들어서 알고있습니다. 제가 알고싶은건 pypy나 cython를 사용하는방법을(가능하다면 윈도우상에서) 알고싶습니다 알 수 없는 사용자 2017.3.8 11:09
    • pypy는 그 자체로 인스톨 하면 됩니다. 윈도우라고 다르지 않습니다. cython의 경우 c컴파일러가 필요합니다.리눅스의 경우 대체로 gcc가 설치되어 있는 경우가 많기 때문에 바로 cython을 이용할 수 있지만 윈도우의 경우 visual c 나 mingw 을 설치해서 c컴파일러를 갖줘야합니다. pypy는 파이썬과 호환되므로 기본적인 사용방법은 같고 cython의 경우 매뉴얼이 잘 되어 있으니 참고하면 됩니다. 어차피 cython은 c코드 transpiler 입니다. cython을 사용하면 c파일이 생성되는 것으로 cython 자체로는 python하고 큰 관계가 없다고 할 수 있습니다. 정영훈 2017.3.8 12:13
    • 제가 많이 부족해서 자세히 알려주시는데 이해를 제대로 못하고있는거 같습니다. pypy 자체가 본문에 있는 사이트를 가면 다운받을수 있다는건 알겠는데 어떤것을 다운받아서 어떻게 설치하는지 기본적일수 있는 지식이 부족한거같습니다. 혹시 도움을 받을수 있는 사이트가 주소 없을까요? cython보다 pypy가 더 빠르다고하고 작업환경이 python이였기때문에 pypy를 활용하고 싶습니다. 알 수 없는 사용자 2017.3.8 13:55
    • Windows binary (32bit) (you might need the VS 2008 runtime library installer vcredist_x86.exe.) 것을 받으면 됩니다. cython 보다 pypy가 빠르다는 것은 모든 상황이 그렇지는 않습니다. 정영훈 2017.3.8 15:19
    • pypy가 언제나 더 빠른게 아닌가보군요. 알려주셔서 감사합니다. 현재 Windows binary로 되어있는게 Python2.7 뿐이고 Python3.3.5는 없던데 그럼 2.7버전에서만 사용가능한건가보죠? 작업을 Python3.6에서 했는데 사용을 위해서 Python2 기반으로 바꾸면되는건가요? 알 수 없는 사용자 2017.3.8 17:04
    • pypy 의 python3 은 베타수준이라고 보면 됩니다. 다만 pypy의 호환수준이 python코드에 한해서 입니다. 확장모듈 즉 python api가 호환되지는 않아서 확장모듈들은 호환성이 없습니다. 많이들 사용하는 numpy scipy 등의 모듈들의 설치가 어렵습니다. 뭐든 그렇지만 일장일단이 있습니다. 저라면 파이썬 코드에서 병목구간을 찾고 그 병목구간을 cython으로 확장모듈을 만들겠습니다. 정영훈 2017.3.8 19:53
    • 느려지는구간만 cython로 구동하신다는 이야기군요? 느려지는구간은 파악하고있습니다. 단지 해당구간에 cython이나 pypy같은 속도개선기능을 추가시키지 못하고있네요. 확인해보니 cython은 아나콘다내에 설치되어있다는 사실은 확인되었습니다. 이제 만들어진 python소스를 cython에 적용시키면 될거같은데 저같은 초보도 윈도우상에서 쉽게 적용시킬수 있는 방법이 있을까요? 넷상을 찾아보니 setup.py를 만들어서 빌드업하라는이야기나 cython를 import 해서 쓰라는식의 이야기가 있던데 깔끔하게 정리되어있는정보가 없어서 다루기 힘드네요 ㅠㅠ 알 수 없는 사용자 2017.3.9 07:03
    • 느려지는 구간만 cython으로 구동하는 것이 아닙니다. cython은 python하고 직접적은 관계가 없습니다. cython의 결과는 c소스입니다. 생성된 c소스를 컴파일하면 python에서 호출가능한 pyd(사실 dll 이나 so입니다.)이 생성됩니다. python은 성능 극복을 위해 c를 적극적으로 활용하며 대표적으로 numpy 등 cpu 바운드가 필요한 영역의 모듈은 c로 확장모듈을 만들어 사용합니다. cython 사용방법은 cython은 공식 매뉴얼이 잘 되어 있으니 공식 매뉴얼을 참고하면 됩니다. 그러나 c언어 지식이 없으면 사용하기 어렵습니다. 정영훈 2017.3.9 10:00
    • C언어를 초보적인 수준에서 다루다가 파이썬을 익히는 입장인지라 그점에서는 그나마 다행이겠네요. 주말에 해보니 cython를 통해 python 파일을 c소스(목적코드)로 바꾼다는 사실을 알게 되었습니다. 하지만, 그렇게 만들어진 목적코드를 python에 적용시키는법을 아직 모르겠더군요. import를 통해 해당 목적코드를 불러와서 쓰는건지 그 점이 헷갈립니다. 언급하신 cython 공식 매뉴얼을 보고 좀 더 연구해보겠습니다. 좋은답변 감사합니다. 알 수 없는 사용자 2017.3.13 08:13
    • 맞습니다. import 로 불러서 사용하는 겁니다. cython에 의해 생성된 c코드를 컴파일 하면 윈도우인 경우 확장자 pyd 파일이 생성됩니다. 그렇게 만들어진 확장모듈은 py 파일과 같이 import 로 로드할 수 있습니다. 또한 jupyter(ipython) 를 활용하면 cython을 보다 쉽게 사용할 수 있습니다. 메뉴얼에 잘 설명되어 있습니다. 정영훈 2017.3.13 11:00
    • 컴파일을 한번 더 해야되는군요. 전 cython를 통해 .pyx를 .c 까지만 만들고 컴파일을 통해 pyd까지 만들지 않아서 import가 안되었던거 같습니다. setup.py를 사용하면 .pyx가 .c 로 나오던데 그 이후에 컴파일작업도 하면 .pyd가 나와서 import가 가능한건가요? 알 수 없는 사용자 2017.3.13 16:40
    • cython anyfile.pyx 하면 anyfile.c 가 생성됩니다. cython의 역활은 이것이 전부라고 할 수 있습니다. visual c 로 anyfile.c 를 동적라이브러리로 컴파일 하면 됩니다. 물론 setup.py 즉 빌드툴로도 컴파일이 가능하고 c가 아니라 pyd 파일이 생성되어야합니다. 그렇게 생성된 확장라이브러리는 import anyfile 식으로 로드할 수 있습니다. 또한 jupyter 를 사용한다면 cython magic 기능을 이용해서 쉘에서 즉시 컴파일을 할 수 있습니다. (매뉴얼에 자세히 나와 있습니다. cython은 문서화가 잘 되어 있으니 문서를 참고하시기 바랍니다.) 정영훈 2017.3.13 19:05
    • https://cython.readthedocs.io/en/latest/index.html 이것을 말씀하시는군요. 전 지금까지 https://docs.google.com/document/d/1Fdkp75yUBEbgf8P4wjLt0L9pHKtPvEvbIJyC0eUN27U/edit#heading=h.3mlt45vvx3r4 여기라고 착각해서 제대로 메뉴얼을 보지 못했습니다. 제대로된 메뉴얼을 찾았으니 조언주신것과 메뉴얼을 보고 해결하면 될꺼같습니다. 자세하고 상세한 답변 감사합니다. 알 수 없는 사용자 2017.3.14 09:35
  • %load_ext Cython
    
    %%cython
    from libc.math cimport sin, round, M_PI
    def fsin(degree):
        cdef double r = round(sin(M_PI * degree / 180) * 10000) / 10000
        return r
    
    fsin(45)
    Out[3]: 0.7071
    
    fsin(30)
    Out[4]: 0.5
    
    fsin(90)
    Out[5]: 1.0
    

    환경: windows 7(x64), visual studio 2015 community

    jupyter(ipython)에서 위와같이 cython magic 이라는 기능을 사용하여 편하게 컴파일 할 수 있습니다.

    • visual studio 2015 community를 설치중에 있습니다. 확실히 python이 인터프리터라 개발하는 속도는 편한데 프로그램 자체 속도는 목적코드를 뽑아내는 c언어를 이길수가 없네요. 자세한 조언을 해주셨으니 이제 cython를 확실히 익혀서 개발속도와 프로그래밍속도 모두 개선해보도록하겠습니다. 알 수 없는 사용자 2017.3.14 10:13

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)