[英]What's the time complexity of list access in Python?
我正在尝试尽可能快地制作 python function。 假设我有一个素数列表,并且我为同一个i
调用了primes[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
是否有任何规则可以从多少次调用中知道将列表元素的值保存在变量中变得有趣?
访问primes[i]
是在常数时间O(1)
内完成的。 这意味着读取primes[i]
所需的时间不会随着primes
变大而增加,也不会随着i
变大而增加。 用外行的话来说:这太他妈快了!
再一次,访问局部变量p
仍然比访问primes[i]
快,因为后者必须查找并调用primes
object 的__getitem__
实现。因此将值缓存在局部变量中而不是查找列表两次稍微快一点。
另一方面,与降低算法复杂度相比,关心边际速度改进是没有意义的。 对于寻找素数的问题,您应该专注于寻找智能算法而不是改进内置列表访问时间。
尝试使用基准
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 或任何其他外部机器中进行操作以获得更好的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.