如何优化python代码:Euler projec prob 4

如何优化python代码:Euler projec prob 4,python,Python,我一直在努力,我的代码运行得很好,但它需要太多的时间(0.41秒)。我如何优化它以减少时间。是否有我遗漏的技巧,或我不知道的特殊函数? 代码如下: #Note: tpal is a function to test if number is palindrome pal =0 for i in range(999,100,-1): if pal >= i*999: #A way to get out of loop and to not test on all numbe

我一直在努力,我的代码运行得很好,但它需要太多的时间(0.41秒)。我如何优化它以减少时间。是否有我遗漏的技巧,或我不知道的特殊函数?
代码如下:

#Note: tpal is a function to test if number is palindrome

pal =0

for i in range(999,100,-1):
    if pal >= i*999:    #A way to get out of loop and to not test on all numbers
        break 
    for j in range(999,100,-1):
        if pal >= i*999:
            break 
        if j > i:                         #numbers would already have been tested so I skip them 
            continue
        pot=i*j
        if ((tpal(pot)==1)and(pot> pal)):
            pal=pot
            i1=i
            j1=j

print(i1,j1,pal)

def tpal(num):
    num=list(str(num))
    Le=len(num)
    if Le == 1: # if number is of one digit than palindrome
        return 1

    le=len(num)

    if le%2 !=0: #4 example 10101even nbr
        le-=1
    le/2    

    for i in range(0,le):
       if num[i]!=num[Le-i-1]:
           return 0

    return 1                  

没有给你完整的答案。这里有一些指针

  • 重新考虑你的for循环,它们是复杂的。也许内部循环应该从
    i
    开始
  • 删除所有那些愚蠢的if语句,如果for循环正确,就不需要它们
  • 最后,
    int(str(pot)[::-1])==pot
编辑:
让男孩/女孩自己解决问题。无需在此处发布解决方案。

试试这个,它不会花费将近31秒的时间:

def isPalindrome(n):
    return str(n) == str(n)[::-1]

def listNums():
    a, b, pal = 0, 0, 0;
    for i in range(999, 99, -1):
        for j in range(999, 99, -1):
            n = i * j
            if isPalindrome(n) and n > pal:  # better to use "n > pal and isPalindrome(n)" instead, see other answer for details.
                a, b, pal = i, j, n
    return a, b, pal             

print listNums()

运行此操作大约需要1秒。对于这样的事情,你当然不需要那些多余的<代码>如果你在循环中使用< /Cord>语句——如果你循环,例如,代码>范围(9999, 999,-1),你可以考虑做一些优化,比如(当然,可以对类似的内容进行多种潜在的优化,例如,不要在每个i,j对中循环两次).

现在发现代码有<1s的运行时,它不再那么有趣了。您可以修改代码以测试更少的数字,并更快地放弃。但是有一个明显的优化非常可爱。这行代码:

        if ((tpal(pot)==1)and(pot> pal)):

每次检查某个内容是否是回文,即使
pot至少可以用j=i.31秒启动内部循环?这是非常非常错误的。你的代码对我来说需要0.1秒,即使是一个完全未优化的1行程序也只需要0.8秒。你的
tpal
函数看起来像什么?@DSM:是的,我得到了同样的结果@DSM当我在堆栈上编写代码时,我省略了打印内容的部分,以便调试(例如:print(I))。显然,这导致它花费了这么多时间。我非常抱歉,不知道打印会造成这么大的损害。但是DSM和A.R.S你说,我只花了0.1秒,就花了0.4秒。有没有办法对它进行优化。哦,好主意;一段代码通过交换两个简单的东西就可以变得快得多,这真是令人惊讶。
        if (pot > pal) and tpal(pot):
In [24]: timeit orig()
1 loops, best of 3: 201 ms per loop

In [25]: timeit orig_swapped()
10 loops, best of 3: 30.1 ms per loop
if le%2 !=0: #4 example 10101even nbr
    le-=1
le/2    
^^^^