programing

Cython 대신 Python/C 인터페이스를 사용하는 장점이 있습니까?

itsource 2022. 8. 17. 21:44
반응형

Cython 대신 Python/C 인터페이스를 사용하는 장점이 있습니까?

BLAS와 LAPACK을 사용하여 C 또는 C++로 모듈을 작성하여 python과 numpy를 확장하고 싶습니다.또한 코드를 스탠드아론 C/C++ 라이브러리로 배포할 수 있도록 하고 싶습니다.이 도서관은 단정도 플로트와 2배정도 플로트를 모두 사용하고 싶습니다.내가 쓸 함수의 예로는 선형 시스템을 풀기 위한 켤레 그라데이션이나 가속 1차 방법 등이 있다.일부 함수는 C/C++ 코드에서 Python 함수를 호출해야 합니다.

Python/C API와 Numpy/C API를 조금 사용해 본 결과, 많은 사람들이 Cython을 대신 사용하는 것을 지지한다는 것을 알게 되었습니다(를 들어 이 질문이나 이 질문 참조).Cython에 대한 전문가는 아니지만, Numpy/C API를 사용하여 동작을 알아야 할 경우가 있는 것 같습니다.Python/C API에 대한 지식이 거의 없고 Python/C API에 대한 지식이 없기 때문에 Python/C API를 계속 사용하는 것이 타당한지, 그리고 이 API를 사용하는 것이 Cython에 비해 몇 가지 이점이 있는지 궁금합니다.향후에는 반드시 수치연산을 수반하지 않는 것을 개발할 것이기 때문에, 이 질문은 numpy에 관한 것만이 아닙니다.Python/C API가 마음에 드는 것 중 하나는 Python 인터프리터가 어떻게 동작하는지 배운다는 것입니다.

고마워요.

현재의 "상위 답변"은 내 귀에는 FUD처럼 들린다.우선, Average Developer가 NumPy+Cython이 제공하는 것보다 더 빠른 코드를 C로 작성할지는 금방 알 수 없습니다.반대로 Python 환경에서 필요한 C 코드를 올바르게 동작시키기까지 걸리는 시간은 보통 Cython에서 빠른 프로토타입을 작성하고, 벤치마킹하고, 최적화하고, 더 빠른 방법으로 다시 쓰고, 다시 벤치마킹하고, 실제로 5~10% 더 필요한 것이 있는지 확인하는 데 훨씬 더 많은 시간을 투자합니다.수동 조정된 C 코드의 2%를 다시 작성하고 Cython 코드에서 호출함으로써 얻을 수 있는 성능.

저는 현재 Cython에 약 18,000줄의 Cython 코드를 가지고 있는 라이브러리를 쓰고 있습니다.한때는 수작업으로 조정된 C코드를 20줄 정도 올바른 위치에 삽입함으로써 매우 중요한 내부 기본 레벨 기능 몇 가지에 대해 거의 25%의 속도를 낼 수 있었습니다.이 작은 부분을 다시 쓰고 최적화하는 데 몇 시간이 걸렸습니다.애초에 C플레인에서 라이브러리를 작성하지 않고(그리고 유지 보수해야 하는) 막대한 시간을 절약한 것에 비하면 아무것도 아닙니다.

Cython보다 C를 더 잘 안다고 해도 Python과 C를 알면 Cython을 빨리 배울 수 있기 때문에 어떤 경우든 투자 가치가 있습니다. 특히 숫자에 관심이 있을 때는 더욱 그렇습니다.코드 작성의 80~95%는 고급 언어로 작성함으로써 많은 이점을 얻을 수 있습니다.따라서 코드 작성에 절약한 시간의 절반을 바로 저급 언어로 작성한 것처럼 빠르게 투자할 수 있습니다.

즉, 「스탠드 아론 C/C++ 라이브러리로 코드를 배포할 수 있도록 한다」라고 하는 코멘트는, 플레인 C/C++를 고집하는 타당한 이유입니다.Cython은 항상 CPython에 의존합니다.이것은 매우 의존적입니다.단, 플레인 C/C++(Python 인터페이스 제외)를 사용해도 NumPy를 이용할 수 없습니다.그것도 CPython에 의존하기 때문입니다.그래서 C로 글을 쓸 때도 마찬가지로 실제 기능에 도달하기 전에 많은 기초 작업을 해야 합니다.당신은 이 일을 시작하기 전에 진지하게 두 번 생각해야 합니다.

첫째, 당신의 질문에 이해가 안 가는 점이 하나 있습니다.

[...] 또한 코드를 독립 실행형 C/C++ 라이브러리로 배포할 수 있어야 합니다. [...] 일부 함수는 C/C++ 코드에서 Python 함수를 호출해야 합니다.

이게 어떻게 작동하는데?

다음으로, 당신의 실제 질문에 대해서, Python/C API를 직접 사용하는 것에는 분명히 이점이 있습니다.

  • 당신은 Cython 코드를 쓰는 것보다 C 코드를 쓰는 것에 더 익숙할 것입니다.

  • 코드를 C로 작성하면 최대한의 제어를 할 수 있습니다.Cython 코드에서 동등한 C 코드에서 동일한 성능을 얻으려면 매우 주의해야 합니다.모든 변수의 유형을 선언해야 할 뿐만 아니라 일부 플래그를 적절하게 설정해야 합니다. 예를 들어 경계 검사를 로 들 수 있습니다.최상의 성능을 얻기 위해 Cython이 어떻게 노력하고 있는지 자세히 알아야 합니다.

  • Cython 코드는 Python에 의존합니다.Cython에서 독립 실행형 C 라이브러리로 배포해야 하는 코드를 작성하는 것은 좋은 생각이 아닌 것 같습니다.

Python/C API의 주요 단점은 내부 루프에서 사용하면 매우 느릴 수 있다는 것입니다.Python 함수를 호출하는 것은 동등한 C++ 함수를 호출하는 것보다 80~160배의 타격을 받는다는 것을 알 수 있습니다.

이것이 당신의 코드에 문제가 되지 않는다면, 당신은 파이썬으로 코드 청크를 쓸 수 있고, 파이썬 라이브러리에 접속할 수 있고, 파이썬으로 직접 작성된 콜백을 지원할 수 있다.즉, 재컴파일 없이 일부 변경 작업을 수행할 수 있어 프로토타입을 더 쉽게 만들 수 있습니다.

언급URL : https://stackoverflow.com/questions/5720272/are-there-advantages-to-use-the-python-c-interface-instead-of-cython

반응형