如何优化此Python代码以更快地运行?

时间:2012-01-05 09:36:22

标签: python performance optimization

我正在解决一个有时间和内存限制的问题,不幸的是,这是时间限制的失败。

我对Python很新,所以对任何有关更快/更好方法的反馈表示赞赏。

这是该计划试图解决的问题:

定义两个字符串A&的相似性。 B作为它们共享的最长公共前缀的长度。即AAAB和AABCAAAB的相似性为2。

程序应输出输入字符串与其所有后缀的相似之和。即对于AAAB,它应该输出

相似性(AAAB,AAAB)+相似性(AAAB,AAB)+相似性(AAAB,AB)+相似性(AAAB,B)= 4 + 2 + 1 + 0 = 7

第一行输入是要输入的字符串数,每个后续行包含要处理的字符串。

from array import array

n = int(sys.stdin.readline()) 
A = [0] * n #List of answers

for i in range(1,n+1):
  string = sys.stdin.readline().strip()    
  A[i-1] = len(string)
  for j in range(1, len(string)):
    substr = string[j:len(string)]
    sum = 0
    for k in range(0, len(substr)):
        if substr[k] != string[k]:
            break
        else:
            sum += 1
    A[i-1] += sum

for i,d in enumerate(A):
  print d

3 个答案:

答案 0 :(得分:2)

在性能方面更喜欢xrange,因为它在python2.X中迭代的速度更快但我能给出的最好的建议是使用timeit来衡量改进和改进,同时调整你的算法。

用谷歌搜索了另一个实现:Longest Common substring解决方案,但python-Levenshtein库可能是你最好的选择,因为它有速度的C扩展......

答案 1 :(得分:1)

第一步是减少你正在做的索引量:

import sys

n = int(sys.stdin.readline())

for i in range(n):
    string = sys.stdin.readline().strip()
    sum = 0
    for offset in range(len(string)):
        suffix = string[offset:]
        for c1, c2 in zip(string, suffix):
            if c1 != c2:
                break
            sum += 1
    print sum

但这仍然是O(N ^ 2)。对于O(N),请使用后缀树或数组,例如http://code.google.com/p/pysuffix/

答案 2 :(得分:1)

您可以尝试其他实施

sum(len(os.path.commonprefix([instr,instr[i:]])) for i in xrange(0,len(instr)))

其中instr =你说的字符串