python - 我可以将这三个循环变为一个循环或做其他事情来使这段代码更快吗?
问题描述
我需要有关 python 代码的帮助,因为这对我来说太慢了。我想让这个更快,但我不知道怎么做。我认为循环必须更少。我什至计算过 (length - 2) ^ 3 = length^3 + 12 * length - 6 * (length^2) - 8 但我不知道如何使用它。请帮忙!代码 :
word = "a word"
letter_1 = ""
letter_2 = ""
letters = list(word)
length = len(letters)
string = ""
number = 0
number2 = 0
words = []
for i in range(length - 2):
letter_1 = letters[i]
for j in range(i + 1,length - 1):
if letters[j] != letter_1:
letter_2 = letters[j]
for k in range(j + 1, length):
if letters[k] != letter_2:
string = letter_1 + letter_2 + letters[k]
number += 1
if not string in words:
words.append(string)
number2 += 1
解决方案
我假设您的代码尝试在名为word
. 如果我的假设不正确,请忽略我的回答并纠正我。
如果是这种情况,我建议进行以下改进:
由于您想要独特的结果,因此列表并不理想,请使用集合;替换
words = []
为words = set()
_words.append(string)
_words.add(string)
由于您在第一个位置找到一个字母时从左到右检查唯一的三元组,当您在第一个位置再次遇到它时,您可能会忽略它,因为您确定您已经遍历了所有组合第一个位置的字母;所以你可以创建额外的集合来验证一个字母是否已经被检查到一个位置:
例如,
word = 'aabc'
您首先进入a
第一位置,然后对照a
、b
和c
; 当您a
再次获得第一名时,您无需再次检查以下字母第二个位置也是如此,因此您可以为已检查的前缀创建一个变量
seen_prefixes = set()
;接着:word = "a word" letter_1 = "" letter_2 = "" letters = list(word) length = len(letters) string = "" number = 0 number2 = 0 words = set() seen_prefixes = set() for i in range(length - 2): letter_1 = letters[i] # check for prefix and add if is a new prefix if letter_1 in seen_prefixes: continue seen_prefixes.add(letter_1) for j in range(i + 1,length - 1): if letters[j] != letter_1: letter_2 = letters[j] # check for prefix and add if is a new prefix if letter_1 + letter_2 in seen_prefixes: continue seen_prefixes.add(letter_1 + letter_2) for k in range(j + 1, length): if letters[k] != letter_2: string = letter_1 + letter_2 + letters[k] number += 1 if not string in words: words.add(string) number2 += 1
请记住,如果变量的值
number
(我假设是检查的三元组的数量)很重要,那么这种改进将不适合您
我认为这些改进可以提高速度,因为迭代次数会大大减少,尤其是当你的word
变量变大时。
与性能无关,但我还建议让您的代码更具可读性,也许封装一些循环并重命名变量,例如number
tochecked_trigrams
和number2
tounique_trigrams_found
推荐阅读
- linux - 有没有办法在 Ubuntu 上运行映像 Windows Docker?
- java - 在 GridBagLayout 中的特定 Tile 上移动时 JPanel 消失
- json - JSONDecodeError:期望值:第 1 行第 1 列(字符 0)在第 response.json() 行
- postgresql - 查询当前正在编辑的数据集的竞争条件
- mysql - Multiple MySQL count in a single query
- python - 使用“for”循环从字典创建数据框对象
- c# - 在 Unity2D 中,无法使用力使实例化对象以一定角度行进
- youtube - YouTube URL attribution_link - 它是什么?
- android - SearchView 聚焦后如何隐藏软键盘?
- python - 散点图和箱线图符号组合到一个图例键