【问题标题】:Interpreting Hamming Distance speed in python在python中解释汉明距离速度
【发布时间】:2023-04-11 11:22:01
【问题描述】:

我一直在努力使我的 python 更加 Python 化,并玩弄短 sn-ps 代码的运行时。我的目标是提高可读性,同时加快执行速度。

此示例与我一直在阅读的最佳实践相冲突,我有兴趣找出我思维过程中的缺陷所在。

问题是在两个相等长度的字符串上计算hamming distance。例如字符串 '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 慢。

我很惊讶我找不到一种方法来获得比 ham_1 运行得更快的 Python 版本。我很难相信 ham_1 是纯 python 的下限。

有人想吗?

【问题讨论】:

  • 我会说只有你的第一个实现是“Pythonic”
  • 最终这是最快的解决方案,sum(i.imap(operator.ne, s_1, s_2)) 在1.03运行。

标签: python runtime timeit hamming-distance


【解决方案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 在循环内部进行查找,因此它们的速度较慢。

【讨论】:

  • 是的,就是这样。谢谢。 ham_4 在大约 1.67991399765 中运行以进行比较。
  • 我对 ham_2 的缓慢感到困惑,经过更多挖掘后,我意识到 operator.countOf 在字符串(每个长度为 1)上运行 for 循环,编译器没有优化它。使用 operator.ne 没有 for 循环,运行时间是上面示例的 1/2。
【解决方案2】:

我想知道从某种更广泛的意义上说,这是否更像 Pythonic。如果您使用 http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.hamming.html ... 一个已经实现您正在寻找的模块怎么办?

【讨论】:

  • OP 要求对字符串数组进行汉明距离计算,而不是 int。 Scipy 空间距离计算仅适用于整数。
猜你喜欢
  • 2016-12-16
  • 2014-09-25
  • 1970-01-01
  • 2017-09-10
  • 2014-09-23
  • 2010-10-31
  • 2015-03-21
  • 2012-03-10
相关资源
最近更新 更多