【发布时间】:2013-10-19 01:21:59
【问题描述】:
我对 python 比较陌生,我对两个相对简单的代码块的性能感到困惑。第一个函数在给定素数列表的情况下生成数字 n 的素数分解。第二个生成 n 的所有因子的列表。尽管prime_factor 会比factors 快(对于相同的n),但我会认为情况并非如此。我不是在寻找更好的算法,而是想了解为什么prime_factor 比factors 慢得多。
def prime_factor(n, primes):
prime_factors = []
i = 0
while n != 1:
if n % primes[i] == 0:
factor = primes[i]
prime_factors.append(factor)
n = n // factor
else: i += 1
return prime_factors
import math
def factors(n):
if n == 0: return []
factors = {1, n}
for i in range(2, math.floor(n ** (1/2)) + 1):
if n % i == 0:
factors.add(i)
factors.add(n // i)
return list(factors)
使用timeit模块,
{ i:factors(i) for i in range(1, 10000) } 需要 2.5 秒
{ i:prime_factor(i, primes) for i in range(1, 10000) } 需要 17 秒
这让我很惊讶。 factors 检查从 1 到 sqrt(n) 的每个数字,而 prime_factor 只检查素数。如果能帮助我理解这两个函数的性能特征,我将不胜感激。
谢谢
编辑:(对 roliu 的回应)
这是我生成从 2 到 up_to 的素数列表的代码:
def primes_up_to(up_to):
marked = [0] * up_to
value = 3
s = 2
primes = [2]
while value < up_to:
if marked[value] == 0:
primes.append(value)
i = value
while i < up_to:
marked[i] = 1
i += value
value += 2
return primes
【问题讨论】:
-
你在哪里定义你提供给
prime_factors()的primes?
标签: python performance algorithm prime-factoring