2017-03-25 1 views
4

다른 jitted 함수를 호출하는 Numba-jitted 함수가이를 인식하고 Python 객체 계층을 거치지 않고 자동으로 빠른 C 호출 규칙을 사용하므로 높은 Python 함수 호출을 피할 수 있습니다. 오버 헤드 :Numba 코드에서 Cython 함수 호출

import numba 

@numba.jit 
def foo(x): 
    return x**2 

@numba.jit 
def bar(x): 
    return 4 * foo(x) # this will be a fast function call 

내 질문은 Numba에서 Cython 함수를 호출하면 같은지 여부입니다.

cpdef double foo(double x): 
    return x**2 

뿐만 아니라 표준 파이썬 모듈 bar.py :

import numba 
import foo 

@numba.jit 
def bar(x): 
    return 4 * foo.foo(x) # will this be a fast function call? 

윌 Numba 자동으로 C-호출 함수로 foo.foo을 인식하거나 내가해야합니까 그럼 제가 사이 썬 모듈, foo.pyx가 있다고 가정 해 보자 CFFI wrapper를 설정하여 수동으로 알려주시겠습니까?

EDIT : 더 자세히 살펴보면 Cython 함수는 파이썬 인터프리터에서 볼 때 표준 "내장"함수 일뿐입니다. 그렇다면 Numba는 파이썬 호출 오버 헤드를 우회하는 내장 함수와 메소드에 대한 호출을 최적화합니까?

답변

4

그 numba 네이티브 코드로 변환하는 방법을 알고있다 (파이썬 표준 라이브러리와 NumPy와 모두에서) 내장 기능의 제한된있다 : 다른

http://numba.pydata.org/numba-doc/latest/reference/pysupported.html http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html

뭐든지 할 수 없습니다가 nopython 모드의 Numba에 의해 지트되므로, 매우 느린 objectmode에 의지해야합니다.

Numba에 cython 함수를 전달하고 nopython 모드에서 직접 인식 할 수있는 방법은 없습니다. Numba는 cffi 용 훅 (Hook)을 가지고 :

당신이 C-수준에서 낮은 수준의 래퍼를 만들 수 있다면 사이 썬 전화까지 당신이 장비 할 수있을 것을, C 코드 외부에서 호출 할 때 활용할 수있는 http://numba.pydata.org/numba-doc/latest/reference/pysupported.html#cffi

; 나는 이것이 가능하다면 100 % 확실하지 않다. 나는 Numba에서 RMath 함수를 호출하기위한이 일에 대해 쓴 :

https://www.continuum.io/blog/developer-blog/calling-c-libraries-numba-using-cffi

그것은 당신이 그 길을 갈 경우 시작하기에 도움이 될 수 있습니다.

+0

감사합니다. 좋은 정보! 1) 이것이 Numba 구현 또는 본질적으로 어려운 것의 한계인지 알고 있습니까? 2) Cython 기능을위한 CFFI 래퍼를 만드는 데 큰 어려움이있는 것처럼 들리도록하십시오. C 측에서 함수 포인터를 가져 와서 적절한 서명을 사용하여 CFFI/ctypes 함수 객체로 감쌀 수 없었습니까? 당신은 그 접근법에 문제가있을 것을 미리 예상합니까? – cfh