我正在尝试尽可能快地创建一个 python 函数。假设我有一个质数列表,并且我正在为同一个 primes[i]
调用 i
n 次。
我的直觉是,从 n 的某个值开始,将 primes[i]
的值保持在变量中会变得更快。
我通过比较以下两个实现做了一些尝试,但我无法弄清楚哪个是最快的。看来访问 primes[i]
的时间取决于很多因素。
第一次实施
while n != 1:
p = primes[i]
if n % p == 0:
n = n // p
factorization.append(p)
else:
i += 1
第二次实施
while n != 1:
if n % primes[i] == 0:
n = n // primes[i]
factorization.append(primes[i])
else:
i += 1
是否有任何规则可以从多少次调用中知道将列表元素的值保存在变量中变得有趣?
答案 0 :(得分:0)
访问 primes[i]
是在常数时间 O(1)
内完成的。这意味着读取 primes[i]
所需的时间不会随着 primes
变大而增加,并且当 i
变大时它不会增加。
用外行的话来说:它该死的快!
再说一次,访问局部变量p
仍然比访问primes[i]
要快,因为后者必须查找并调用__getitem__
对象的primes
实现.因此,在局部变量中缓存一个值而不是两次查找列表会稍微快一些。
另一方面,与降低算法复杂度相比,关心边际速度提升毫无意义。对于寻找素数的问题,您应该专注于寻找智能算法,而不是改进内置列表的访问时间。
答案 1 :(得分:-1)
尝试使用基准
import time
start = time.time()
while n != 1:
p = primes[i]
if n % p == 0:
n = n // p
factorization.append(p)
else:
i += 1
end = time.time()
print(end - start)
对实现 2 执行相同的操作并进行比较。
此外,尝试在 google colab 或任何其他外部机器中执行此操作以获得更好的结果。