2016-09-28 69 views
0

我需要使用ctypes函數來減少python中quad的運行時間。這是我原來的問題original question,但現在我知道我需要遵循什麼路徑。我需要按照與此處similar problem link相同的步驟操作。optimazing使用ctypes python quad

但在我的情況下,將在數值積分中處理的函數調用另一個python函數。就像這樣:

from sklearn.neighbors import KernelDensity 
import numpy as np 

funcA = lambda x: np.exp(kde_bad.score_samples([[x]])) 
quad(funcA, 0, cut_off) 

其中停產僅僅是我在我的代碼決定一個標量,並kde_bad是使用KernelDensity內核對象創建的。

所以我的問題是我如何需要在C中指定函數?相當於此:

//testlib.c 

double f(int n, double args[n])  
{ 
    return args[0] - args[1] * args[2]; //corresponds to x0 - x1 * x2 
} 

任何輸入讚賞!

回答

0

You can do this using ctypes's callback function facilities.

這就是說,無論是否會真正實現任何速度下的收益,如果你的函數調用Python的東西是值得商榷的。 ctypes加快集成的基本原因有兩個:(1)集成函數本身比編譯的C更快於Python字節碼,(2)避免了從編譯的(Fortran!)QUADPACK例程回調Python。你提出的建議完全消除了這些性能提升的第二個來源,如果你多次打這樣的電話,甚至可能會增加懲罰。但是,如果被積函數的大部分執行時間在自己的代碼中,而不是在您需要調用的其他Python函數中,那麼您可能會看到一些好處。