给定一个字符串,通常是一个句子,我想提取长度为3、4、5、6
的所有子字符串。如何仅使用Python标准库有效地实现这一点?这是我的方法,我正在寻找更快的解决方案。对我来说,无论如何,似乎三个外部循环都是不可避免的,但也许有一个低级优化的itertools
等解决方案。
import time
def naive(test_sentence, start, end):
grams = []
for word in test_sentence:
for size in range(start, end):
for i in range(len(word)):
k = word[i:i+size]
if len(k)==size:
grams.append(k)
return grams
n = 10**6
start, end = 3, 7
test_sentence = "Hi this is a wonderful test sentence".split(" ")
start_time = time.time()
for _ in range(n):
naive(test_sentence, start, end)
end_time = time.time()
print(f"{end-start} seconds for naive approach")
naive()
的输出:['thi', 'his', 'this', 'won', 'ond', 'nde', 'der', 'erf', 'rfu', 'ful', 'wond', 'onde', 'nder', 'derf', 'erfu', 'rful', 'wonde', 'onder', 'nderf', 'derfu', 'erful', 'wonder', 'onderf', 'nderfu', 'derful', 'tes', 'est', 'test', 'sen', 'ent', 'nte', 'ten', 'enc', 'nce', 'sent', 'ente', 'nten', 'tenc', 'ence', 'sente', 'enten', 'ntenc', 'tence', 'senten', 'entenc', 'ntence']
第二个版本:
def naive2(test_sentence,start,end):
grams = []
for word in test_sentence:
if len(word) >= start:
for size in range(start,end):
for i in range(len(word)-size+1):
grams.append(word[i:i+size])
return grams
len(k)==size
检查可以被消除 - 唯一可能失败的方式是如果您从句子末尾开始切片,但这可以通过减少for i
循环的范围来更好地处理。此外,您真的需要所有子字符串同时存在于列表中吗?通过在生成器函数中逐个生成它们,内存使用量可以大大减少。 - jasonharper{end-start} 秒
不正确。你能修正一下并且展示一下两种解决方案的时间吗? - Kelly Bundy