我正在尝试打印一个大于或等于给定数字的主要回文' 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的新手。我无法理解,只需分配一个新变量,执行时间如何变化如此之多? 请帮助。
答案 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)):
之前放置苹果赋值来减慢代码的原因是编译器优化和缓存。