代码:
digits2 = digits[0]
for d in digits[1:]:
if digits2[-1] != d:
digits2 += d
性能
C:\samples\soundex\stage2>python soundex2c.py
Woo W000 12.6070768771
Pilgrim P426 14.4033353401
Flingjingwaller F452 19.7774882003
问自己几个问题:每次循环都用digits[-1],高效吗?
用list索引高效吗?怎样更高效的维护每个变量的上一个digit?
优化代码2:
digits2 = ''
last_digit = ''
for d in digits:
if d != last_digit:
digits2 += d
last_digit = d
性能
C:\samples\soundex\stage3>python soundex3a.py
Woo W000 11.5346048171
Pilgrim P426 13.3950636184
Flingjingwaller F452 18.6108927252
下面纯属翻译,有点不明白
为什么上述代码没有更快。(不是快了挺多的吗。)在Python中,用list的索引(index)相当的快。重复读取digit2[-1]
完全没有问题。另一方面:手动维护每个变量的最后一个digit意味着对于我们存储的每个digit都有两次赋值操作(原文:
means we have two variable assignments for each digit we're storing) (two variable assignments 可能是其他什么意思吧),清除了我们可能在去除list查询中获得的小小优化。(which wipes
out any small gains we might have gotten from eliminating the list lookup)
优化代码3
digits2 = "".join([digits[i] for i in range(len(digits))
if i == 0 or digits[i-1] != digits[i]])
性能
C:\samples\soundex\stage3>python soundex3b.py
Woo W000 14.2245271396
Pilgrim P426 17.8337165757
Flingjingwaller F452 25.9954005327
性能没有提升。