[英]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_2
和ham_3
在循環內部進行查找,因此速度較慢。
我想知道在某種更廣泛的意義上,這可能會更像Pythonic。 如果您使用http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.hamming.html ...已經實現了您正在尋找的模塊,該怎么辦?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.