【发布时间】:2014-10-26 22:20:06
【问题描述】:
这主要是一个学习 Python 的练习。我写了这个函数来测试一个数字是否是素数:
def p1(n):
for d in xrange(2, int(math.sqrt(n)) + 1):
if n % d == 0:
return False
return True
然后我意识到我可以使用 any() 轻松重写它:
def p2(n):
return not any((n % d == 0) for d in xrange(2, int(math.sqrt(n)) + 1))
在性能方面,我期望 p2 比 p1 更快,或者至少和 p1 一样快,因为 any() 是内置的,但是对于一个大的素数,p2 会慢很多:
$ python -m timeit -n 100000 -s "import test" "test.p1(999983)"
100000 loops, best of 3: 60.2 usec per loop
$ python -m timeit -n 100000 -s "import test" "test.p2(999983)"
100000 loops, best of 3: 88.1 usec per loop
我在这里错误地使用了 any() 吗?有没有办法使用 any() 编写这个函数,这样它就可以迭代自己?
更新:更大素数的数字
$ python -m timeit -n 1000 -s "import test" "test.p1(9999999999971)"
1000 loops, best of 3: 181 msec per loop
$ python -m timeit -n 1000 -s "import test" "test.p2(9999999999971)"
1000 loops, best of 3: 261 msec per loop
【问题讨论】:
-
见 docs.python.org/2/library/functions.html#any 它确实和你写的很像。
-
@rightføld 增加 50% 是很小的差别吗?
-
不,但是
-
与您的问题没有任何关系,但出于好奇(以及我糟糕的数学技能),您介意向我解释一下为什么您只需要使用
xrange(2, int(math.sqrt(n)) + 1)范围吗?我一直都是xrange(2, n)。 -
@IanAuld,如果
sqrt(n)之上的任何x将除以n,那么另一个因素将是< sqrt(n),到那时你就会找到它。
标签: python