【问题标题】:Is it possible to create a(n uninialized) Python list of n integers in [0,n) in O(1) time?是否可以在 O(1) 时间内在 [0,n) 中创建一个包含 n 个整数的(n 个未初始化的)Python 列表?
【发布时间】:2020-12-04 11:17:47
【问题描述】:

下面的 Python 代码创建了一个(n 个已初始化的)n 个非负整数列表,每个非负整数最多为 n-1:

a = [0] * n

我假设由于初始化,该指令需要 O(n) 时间。 Python中有没有办法在O(1)时间内获得n个整数列表?我不在乎列表是否已初始化。我只希望时间复杂度为 O(1)。我还希望列表可变并支持 O(1) 时间访问和更新 i-th 条目。这可以通过malloc 在 C 中轻松完成。 Python 怎么样?

【问题讨论】:

  • “这可以通过 malloc 在 C 中轻松完成”绝对不是。 Malloc 不初始化任何东西。 c 中的 malloc 分配空间,但分配的内存未初始化。这意味着如果你在调用 malloc 之后读取一个分配的内存值,你将得到一个不确定的结果。 See also here 我的意思是你在比较两个不同的东西。你不能说 malloc 在 0(1) 中初始化
  • @joostblack,感谢您的指点。但是,建议的虚拟列表不是我想要的。例如,似乎很难保持 python 列表在 O(1) 时间内获取/设置虚拟列表的第 i 个条目的优势。
  • @juanpa.arrivillaga,信不信由你,这就是我想做的事情......我有我自己的理由。我同意 Python 可能是一种错误的语言。但是,不知怎的,我别无选择……
  • @juanpa.arrivillaga,感谢您的理解。一个简单的回答说这在 Python 中是不可能的,实际上也很好。
  • Python/C memory management documentation 可能包含一些有用的信息

标签: python arrays time


【解决方案1】:

如果你想要速度,我建议你使用 NumPy 创建一个列表。只需使用具有不同值的 NumPy 创建一个列表,您也可以通过调用不同的函数来使用零或随机值对其进行初始化。这是我所知道的获取列表的最快方式。

import numpy as np
my_array = np.zeros(n)

【讨论】:

  • 这是一个初始化数组。此外,numpy 数组不是列表。它们有不同的性能权衡。
  • @evenodd 为什么不使用一个空列表?
  • @ juanpa.arrivillaga,好问题。例如,一个空列表会使 a[n//2] = 1 变得昂贵。
  • @evenodd 那么空的dict 怎么样?
  • @juanpa.arrivillaga,dict 使用哈希函数。最坏的情况可能非常糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2016-10-31
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多