在Python中,哪一个在内存和速度列表或字典方面更昂贵

在Python中,哪一个在内存和速度列表或字典方面更昂贵,python,memoization,Python,Memoization,我正在电脑上测试记忆代码。我有范围为100000的数组。使用以下代码 def fact1(n): if n<1: return 1 else: fa=1 for i in range(1, n+1): fa*=i return fa 从我对代码的理解来看,尽管内存优化,但记忆开始以低速运行。我是否正确地理解了通过存储计算值来避免重新计算?如果这是正确的,为什么尽管计算值随时可用,但较大的计算速度会减慢 使用m

我正在电脑上测试记忆代码。我有范围为100000的数组。使用以下代码

def fact1(n):
   if n<1:
      return 1
   else:
      fa=1
      for i in range(1, n+1):
          fa*=i
      return fa
从我对代码的理解来看,尽管内存优化,但记忆开始以低速运行。我是否正确地理解了通过存储计算值来避免重新计算?如果这是正确的,为什么尽管计算值随时可用,但较大的计算速度会减慢


使用memoization优化内存和速度的最佳方法是什么?

您不需要调用
.keys()
-如果n不在memookuptable:中,您只需使用
。我认为应该更快,因为它使用哈希
.keys()
返回一个列表,查找速度较慢。

.keys()
在Python2中返回一个列表,但在Python3中返回一个动态列表,但在每次循环迭代中创建一个新列表仍然非常低效。有趣。我会尽量记住查找2 vs 3,或者在我的回答中注意到它是针对Python 2的。简短回答:列表使用的内存比dict少,需要扩展时速度更快,如果您知道索引,那么列表查找比dict查找快。但是,如果您需要在列表中搜索某个项目,这比直接访问dict项目(如果您知道其键)要慢得多。如果您不打算使用列表中的所有插槽,dict可能会使用更少的RAM。对不起,我写了memo.keys()。在编写代码之后,我意识到了这一点。谢谢我的错。
  memolookuptable={1:1, 2:2}
  def fact2(n):
      if n not in memoookuptable.keys():
          for i in range(3,n+1):
              if i not in memoookuptable.keys():
                   memolookuptable[i]=i*memolookuptable[i-1]