[英]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.