python - Python中列表访问的时间复杂度是多少?
问题描述
我正在尝试尽可能快地制作 python 函数。假设我有一个主要列表,并且我为此调用primes[i]
了 n 次i
。
我的直觉是,从 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]
,因为后者必须查找并调用对象的__getitem__
实现primes
。因此,在局部变量中缓存一个值而不是两次查找列表会稍微快一些。
另一方面,与降低算法复杂度相比,关心边际速度的提高是没有意义的。对于寻找素数的问题,您应该专注于寻找一种智能算法,而不是改善内置列表的访问时间。
推荐阅读
- amazon-web-services - Unable to set variable in AWS pgsql
- java - how to store file bytes in memory for files bigger than 2^32 bytes size
- dialog - X++ 对话框字段查找覆盖错误 DialogControl.Control 无法从服务器调用
- javascript - Currently trying to use my MobileNet in a web application, nothing seems to work
- css - Vuetify v-btn 水平向右
- python - 为什么'withColumn'在pyspark中花费这么长时间?
- android - Android TYPE_ACCESSIBILITY_OVERLAY z 顺序控制
- css - css背景速记中的{1,2}是什么意思
- python - 当多个请求需要访问同一个对象时,Django 并发问题/竞争条件?
- reactjs - 'TypeError:无法读取未定义的属性'internal_method',当我限制了上下文时