나는 효율성 부분을 my other answer으로 과장했을 수 있습니다. 내가 의미 한 바는 : 파이썬 객체를 사용해야 할 때 1.5 배 이상의 큰 스피드 업을 기대하지 마라.
파이썬 코드에서 사용하는 것보다 사용할 수 있으며 매우 드문 경우를 제외하고는 느려지지 않습니다. 그러나 Cython의 위대한 힘은 네이티브 C 유형과 c 배열 (파이썬 목록 또는 사전보다 훨씬 빠를 수 있음) 또는 C++로 이동하면 동등한 데이터 구조 (vector
, unordered_map
등)를 활용할 수 있다는 것입니다. 파이썬 객체를 처리 할 때
한 점은 기억 모든 파이썬 객체는 일부 구조체에 대한 포인터가 있다는 것입니다, 그래서 각각의 하나는 간접적 인 레이어를 추가 - 그 파이썬 int
의 심지어 사실이다. 그러나 Cython int
은 간접 참조가없는 C 정수입니다. 그것은 for
-Cython에서의 루프가 훨씬 더 빠른 주된 이유 중 하나입니다. (하지만 파이썬에서와 같이 무제한의 정밀도가 아니라 64 비트의 범위로 제한됩니다.
또 다른 점 파이썬 객체에서 작동하는 것은 당신이 파이썬 기반의 조회를 피하는 사이 썬 추가 속도를 얻기 위해 Python C API을 사용할 수있는 내장 객체 위한 그러나 비단뱀 조회, 비단뱀 작업 등을 통해 갈 필요가 있다는 것을 의미한다는 것입니다
def dumb_func(dict dct, str key):
return dct[key] # translates to: __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_v_key)
def dumb_func(object dct, object key): # different signature
return dct[key] # translates to: PyObject_GetItem(__pyx_v_dct, __pyx_v_key)
당신은 아마 하나가 빠르게 직접 DICT를 adresses 사람 (__Pyx_PyDict_GetItem
인 추측 할 수는 아마입니다 : 선언 dicts와 예를 들어, 다음 코드는 다르게 컴파일 (DefaultDict
내가 생각, 그들 가운데되지 않습니다) PyDict_GetItem
및에 대한 정교한 래퍼 10) 또는 PyObject_GetItem
(파이썬 룩업을 거치며)으로 파이썬 객체를 처리하는 것. 엄청난 속도 향상은 아니지만 눈에 띄는 것입니다.
결국 정상적인 (그리고 선언 된) dict
은 분명히 Cython 코드에서 DefaultDict
(일부 C 또는 C++ 클래스 제외)보다 빠르다고 말할 수 있습니다.