小编dam*_*zam的帖子

Python的集合模块中的defaultdict是否真的比使用setdefault快?

我见过其他Python程序员使用collections模块中的defaultdict来实现以下用例:

from collections import defaultdict

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

def main():
    d = defaultdict(list)
    for k, v in s:
        d[k].append(v)
Run Code Online (Sandbox Code Playgroud)

我通常使用setdefault来解决这个问题:

def main():
    d = {}
    for k, v in s:
        d.setdefault(k, []).append(v)
Run Code Online (Sandbox Code Playgroud)

文档实际上声称使用defaultdict更快,但我在测试自己时看到了相反的情况:

$ python -mtimeit -s "from withsetdefault import main; s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)];" "main()"
100000 loops, best of 3: 4.51 usec per loop
$ python -mtimeit -s "from withdefaultdict …
Run Code Online (Sandbox Code Playgroud)

python collections setdefault defaultdict python-collections

17
推荐指数
1
解决办法
5930
查看次数

Python的difflib中的SequenceMatcher是否可以提供更有效的方法来计算Levenshtein距离?

这是计算Levenshtein距离的一般算法的教科书示例(我从Magnus Hetland的网站中提取):

def levenshtein(a,b):
    "Calculates the Levenshtein distance between a and b."
    n, m = len(a), len(b)
    if n > m:
        # Make sure n <= m, to use O(min(n,m)) space
        a,b = b,a
        n,m = m,n

    current = range(n+1)
    for i in range(1,m+1):
        previous, current = current, [i]+[0]*n
        for j in range(1,n+1):
            add, delete = previous[j]+1, current[j-1]+1
            change = previous[j-1]
            if a[j-1] != b[i-1]:
                change = change + 1
            current[j] = min(add, delete, change)

    return current[n]
Run Code Online (Sandbox Code Playgroud)

然而,我想知道是否有更高效(可能更优雅)的纯Python实现使用difflib的SequenceManager.在玩完之后,这就是我想出的: …

python algorithm performance difflib levenshtein-distance

7
推荐指数
1
解决办法
2271
查看次数