考慮下面的類:建議
class SquareErrorDistance(object):
def __init__(self, dataSample):
variance = var(list(dataSample))
if variance == 0:
self._norm = 1.0
else:
self._norm = 1.0/(2 * variance)
def __call__(self, u, v): # u and v are floats
return (u - v) ** 2 * self._norm
我用它來計算一個矢量的兩個元素之間的距離。我基本上爲使用此距離度量的向量的每個維度創建該類的一個實例(有使用其他距離度量的維度)。分析表明,這個類的功能佔我knn實現的運行時間的90%(誰會想到)。我不認爲有任何純Python的方式來加速,但也許如果我在C中實現它?
如果我運行一個簡單的C程序,它使用上面的公式計算隨機值的距離,它比Python快幾個數量級。所以我嘗試使用ctypes並調用一個執行計算的C函數,但顯然參數和返回值的轉換遠遠要昂貴,因爲結果代碼要慢得多。
我當然可以在C中實現整個kn並且只是調用它,但問題是,就像我所描述的,我使用不同的距離函數來處理矢量的某個維度,並且將這些轉換爲C會太多工作。
那麼我的替代方案是什麼?使用Python C-API編寫C函數會擺脫開銷嗎?有沒有其他的方法來加速這個計算?
我會建議Cython(答案與示例實現可能會在幾分鐘內)。我猜你算法已經儘可能地調整過了嗎? – delnan 2010-11-21 18:09:24
@delnan:我已經在可能和適當的地方使用了緩存,所以我沒有看到任何保存距離計算的方法。 – 2010-11-21 18:17:48
那麼......無關,什麼是'dataSample'和'var'? – delnan 2010-11-21 18:21:52