2017-01-28 2 views
1

DefaultDict을 사용하기 위해 Python 객체 유형 선언이 필요하기 때문에 다음 확장 유형 may not be very efficient에 대해 이야기했습니다. 왜 누군가가 이것을 설명 할 수 있고, DefaultDict이 여전히 가치가있을 수 있는지 (dict과 반대)?개체 유형 선언을 사용하여이 확장 유형이 어느 정도로 비효율적 일 수 있습니까?

cdef class CythonClass(object): 

    cdef int var1, var2 
    cdef object defaultdict 

    def __init__(self, a, b): 
     self.var1 = a 
     self.var2 = b 
     self.defaultdict = DefaultDict(DefaultDict([])) 

답변

1

나는 효율성 부분을 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++ 클래스 제외)보다 빠르다고 말할 수 있습니다.