对你有好处冈萨洛。太坏的结果不正确。我修改了你的代码有点:
- def is_prime2(n):
- if n<=1:
- return False
- elif n in (2, 3, 5, 7):
- return True
- elif str(n)[-1] in ('0', '2', '4', '5', '6', '8'):
- return False
- elif n%3==0:
- return False
- elif n%7==0:
- return False
- else:
- for i in range(11, int(n**0.5)+1, 2):
- if not n%i:
- return False
- return True
我对比了三个函数使用的速度时间模块。is_prime()是我最初的建议,is_prime1()是你的原始代码,和is_prime2()代码修改。
- if __name__ == '__main__':
- import timeit
- t = timeit.Timer("is_prime(2000097)", "from __main__ import is_prime")
- print t.timeit()
- t = timeit.Timer("is_prime1(2000097)", "from __main__ import is_prime1")
- print t.timeit()
- t = timeit.Timer("is_prime2(2000097)", "from __main__ import is_prime2")
- print t.timeit()
使用2000097这个数字,结果几乎相同:
- >>> 1.45488211364
- 1.42580345757
- 1.42388930047
- >>> 1.4366972181
- 1.44870719986
- 1.42893746692
- >>> 1.43660163505
- 1.43026986126
- 1.46972456191
- >>> 1.44520062355
- 1.4405034696
- 1.42799974136
- >>> 1.4306084289
- 1.44109168939
- 1.42320573522
- >>>
使用2000095这个数字,你的原始代码失败。使用10次迭代代替1000000:
- >>> 2.48837116033e-005
- 1.38539355502
- 1.83635415283e-005
- >>>
你的原始代码的问题是,你查看最后一个数字是什么号码。而不是:elif int (m[1]) = =(2或4或6或8 0 5):应该是这样的:elif str (n) [1] (' 0 ', ' 2 ', ' 4 ', ' 5 ', ' 6 ', ' 8 '):