簡體   English   中英

解釋python中的漢明距離速度

[英]Interpreting Hamming Distance speed in python

我一直在努力使我的python更加pythonic和toying與短代碼片段的運行時間。 我的目標是提高可讀性,但另外,還要加快執行速度。

這個例子與我一直在閱讀的最佳實踐相沖突,我有興趣找到我思考過程中的缺陷所在。

問題是在兩個相等長度的弦上計算漢明距離 例如,字符串'aaab'和'aaaa'的漢明距離是1。

我能想到的最簡單的實現如下:

def hamming_distance_1(s_1, s_2):
    dist = 0
    for x in range(len(s_1)):
        if s_1[x] != s_2[x]:  dist += 1
    return dist

接下來我寫了兩個“pythonic”實現:

def hamming_distance_2(s_1, s_2): 
    return sum(i.imap(operator.countOf, s_1, s_2))

def hamming_distance_3(s_1, s_2): 
    return sum(i.imap(lambda s: int(s[0]!=s[1]), i.izip(s_1, s_2)))  

執行中:

s_1 = (''.join(random.choice('ABCDEFG') for i in range(10000)))
s_2 = (''.join(random.choice('ABCDEFG') for i in range(10000)))
print 'ham_1  ',  timeit.timeit('hamming_distance_1(s_1, s_2)',  "from __main__ import s_1,s_2, hamming_distance_1",number=1000)
print 'ham_2  ',  timeit.timeit('hamming_distance_2(s_1, s_2)',  "from __main__ import s_1,s_2, hamming_distance_2",number=1000)
print 'ham_3  ',  timeit.timeit('hamming_distance_3(s_1, s_2)',  "from __main__ import s_1,s_2, hamming_distance_3",number=1000)

返回:

ham_1   1.84980392456
ham_2   3.26420593262
ham_3   3.98718094826

我預計ham_3會比ham_2運行得慢,因為調用lambda被視為函數調用,這比調用內置的operator.countOf要慢。

我很驚訝我無法找到一種方法來獲得更快的pythonic版本,然后運行得更快。 我很難相信ham_1是純蟒蛇的下限。

想什么?

關鍵是減少方法查找和函數調用:

def hamming_distance_4(s_1, s_2):
    return sum(i != j for i, j in i.izip(s_1, s_2))

在我的系統中運行ham_4 1.10134792328

ham_2ham_3在循環內部進行查找,因此速度較慢。

我想知道在某種更廣泛的意義上,這可能會更像Pythonic。 如果您使用http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.hamming.html ...已經實現了您正在尋找的模塊,該怎么辦?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM