2014-07-21 14 views
5

sklearn'dan bir kümeleme algoritması için özel bir uzaklık metriği işlevi kullanırken bir performans darboğazına giriyorum.Bu küçük mesafe Python işlevinin performansı nasıl geliştirilir

çalıştırın yılan Run tarafından gösterildiği gibi sonuç şudur:

enter image description here

açıkça bir sorun dbscan_metric fonksiyonudur. fonksiyonu çok basit görünüyor ve ben oldukça hızlandırmak için en iyi yaklaşım ne olurdu bilmiyorum: bu yavaş çok duyacağız olmaya neden olduğunu ne olduğu

def dbscan_metric(a,b): 
    if a.shape[0] != NUM_FEATURES: 
    return np.linalg.norm(a-b) 
    else: 
    return np.linalg.norm(np.multiply(FTR_WEIGHTS, (a-b))) 

Herhangi düşünceler.

+0

Bu diziler ne kadar büyük? Eğer if ifadesinden kurtulur ve veri kümesinin iki ifadesinden birini zorlarsanız hızlanır mı? ... 'nı (a)! = NUM_FEATURES' yerine deneyebilir ve daha hızlı bir şekilde ... –

+1

cevabı a ve b dizilerinin ne kadar büyük olduğuna bağlıdır. Hangi numpy sürümünü kullanıyorsunuz? profile bakılırsa, muhtemelen küçüktürler ve python yükünün egemenliği altındadırlar, bu durumda, – jtaylor

+1

'u azaltmak için cython'u kullanmanız gerekir. [email protected]'de 71 saniyenin harcanması ve 170 sn'nin başka yerlerde harcanması garip görünüyor mu? Bu diyagramı nasıl anlayacağımı bildiğimi sanıyordum, ama bu garip görünüyor. Tüm tahmin edebileceğim şey, ekstra 170 saniyenin bir şekilde çağrı yüküne dahil olduğudur. Inlinlemeyi deneyebilir misin? – user1245262

cevap

1

Fonksiyonun ne işe yaradığını bilmiyorum - ancak tekrarlanan hesaplamalar var mı? Eğer öyleyse, bu fonksiyonu kestirebilirsiniz:

cache = {} 
def dbscan_metric(a,b): 

    diff = a - b 

    if a.shape[0] != NUM_FEATURES: 
    to_calc = diff 
    else: 
    to_calc = np.multiply(FTR_WEIGHTS, diff) 

    if not cache.get(to_calc): cache[to_calc] = np.linalg.norm(to_calc) 

    return cache[to_calc]