首页 > 解决方案 > 我可以将这三个循环变为一个循环或做其他事情来使这段代码更快吗?

问题描述

我需要有关 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

标签: pythonperformanceloopsvelocity

解决方案


我假设您的代码尝试在名为word. 如果我的假设不正确,请忽略我的回答并纠正我。

如果是这种情况,我建议进行以下改进:

  1. 由于您想要独特的结果,因此列表并不理想,请使用集合;替换words = []words = set()_ words.append(string)_words.add(string)

  2. 由于您在第一个位置找到一个字母时从左到右检查唯一的三元组,当您在第一个位置再次遇到它时,您可能会忽略它,因为您确定您已经遍历了所有组合第一个位置的字母;所以你可以创建额外的集合来验证一个字母是否已经被检查到一个位置:

    例如,word = 'aabc'您首先进入a第一位置,然后对照abc; 当您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变量变大时。

与性能无关,但我还建议让您的代码更具可读性,也许封装一些循环并重命名变量,例如numbertochecked_trigramsnumber2tounique_trigrams_found


推荐阅读