簡體   English   中英

如何優化此Python代碼以更快地運行?

[英]How can I optimize this Python code to run faster?

我正在解決一個有時間和內存限制的問題,不幸的是,這是時間限制的失敗。

我是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

在性能方面,更喜歡xrange,因為它在python2.X中迭代更快。但我能給出的最佳建議是使用timeit來測量變化和改進,同時調整算法。

谷歌搜索了另一個實現: 最長的共同子串解決方案,但python-Levenshtein庫可能是你最好的選擇,因為它有速度的C擴展...

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

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/

您可以嘗試其他實現

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

instr =你說的字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM