用于计算两个字符串之间相同位置的相同字符的算法

时间:2017-04-26 15:39:32

标签: python optimization

这两个中哪一个更优化和/或更pythonic代码? 函数返回字符串1中包含字符串2中相应位置的相同字符的位置数:

def compare(s1, s2):
    count = 0
    for i in s1:
        if i == s2[s1.index(i)]:
            count += 1
    print(count)

def compare2(s1, s2):
    count = 0
    for i in range(0, len(s1)):
        if s1[i] == s2[i]:
            count += 1
    print(count)

2 个答案:

答案 0 :(得分:1)

严格来说,在性能方面,第一个 compare()是二次的,因为它在O(n)内部有一个O(n)索引()操作 - 环。第二个 compare2()要好得多,因为它使用i进行O(1)随机访问索引。

那就是说,@ CharlesDuffy指出了需要首先解决的正确性问题。

对于函数调用开销不重要的长字符串,请考虑这个应该运行得非常快的替代方法:

>>> a = 'abcdefghijklmnopqrstuvwxyz'
>>> b = 'a---e---i-----o-----u---y-'
>>> sum(map(str.__eq__, a, b))
6

在Python 2中,添加此优化以提高缓存效率:

>>> from itertools import imap          # iterator version of map()
>>> sum(imap(str.__eq__, a, b))
6

答案 1 :(得分:-2)

第二个更优化,因为你没有不必要地调用函数(c1.index())。