Python中查询的执行时间差异

时间:2016-03-11 17:18:36

标签: python python-2.7

我正在尝试打印一个大于或等于给定数字的主要回文' t'

我的代码是 -

from math import sqrt
#import sys
from time import time

def is_prime(t):
    flag=True
    if(t<2):
        return False
    for i in range(2,int(sqrt(t))+1):
        if t%i==0:
            flag=False
            break
    if flag==True:
        return True
    else:
        return False


def is_palindrome(t):
    flag=False
    string=str(t)
    length=len(string)
    count=0
    for i in range(0,length/2):
        if(string[i]==string[length-1-i]):
            count+=1
        else:
            break
    if count==length/2:
        return True
    else:
        return False

def start():
    t= int (raw_input())
    t0 = time()

    while(True):
        apple=is_prime(t)
        if(is_palindrome(t)):
            if(apple):            
                print t
                print "Execution time:", round(time()-t0, 3), "s"
                break
        t=t+1


start()

此代码运行正常。在start()函数中,我添加了一个语句来计算执行时间。对于测试用例 - 99999执行时间约为14.05秒。 但如果我用下面的那个改变函数start -

def start():
    t= int (raw_input())
    t0 = time()

    while(True):
        if(is_palindrome(t)):
            if(is_prime(t)):            
                print t
                print "Execution time:", round(time()-t0, 3), "s"
                break
        t=t+1

然后,相同测试用例(99999)的执行时间减少到1.3秒。我是python的新手。我无法理解,只需分配一个新变量,执行时间如何变化如此之多? 请帮助。

2 个答案:

答案 0 :(得分:3)

is_prime测试很昂贵。 is_palindrome测试要便宜得多。在更快的情况下,如果数字是回文,则只计算is_prime,导致对is_prime的调用次数减少,因此程序执行速度更快。

答案 1 :(得分:0)

它不是关于分配变量。运行此示例

def start2():
    t= int (raw_input())
    t0 = time()

    while(True):
        if(is_palindrome(t)):
            apple=is_prime(t)
            if(apple):            
                print t
                print "Execution time:", round(time()-t0, 3), "s"
                break
        t=t+1

需要大约1.3秒。

所以这里改变的是你分配苹果的地方。 通过在if(is_palindrome(t)):之前放置苹果赋值来减慢代码的原因是编译器优化和缓存。

编辑:请在Dave Bacher的回答中找到正确的答案。