python中重新分配的内存复杂性

python中重新分配的内存复杂性,python,memory,complexity-theory,Python,Memory,Complexity Theory,我想知道在python中将一个线性变量重新分配给一个新的线性类型变量的内存复杂性是多少。例如,考虑一个具有一个列表参数的函数,它将其转换为SET. def func(list_var): list_var = set(list_var) return list_var 是O(n)内存复杂度还是O(1)?赋值本身是不必要的;从调用方的角度来看,以下内容具有完全相同的语义: def func(list_var): return set(list_var) 重要的部分是对s

我想知道在python中将一个线性变量重新分配给一个新的线性类型变量的内存复杂性是多少。例如,考虑一个具有一个列表参数的函数,它将其转换为SET.

def func(list_var):
    list_var = set(list_var)
    return list_var

是O(n)内存复杂度还是O(1)?

赋值本身是不必要的;从调用方的角度来看,以下内容具有完全相同的语义:

def func(list_var):
    return set(list_var)

重要的部分是对
set
的调用,它必须为数据结构分配
n
新引用,在
list\u var
中每个元素分配一个引用,因此空间复杂度为O(n)。

那么
func
的复杂度是线性的,您正在将一个列表转换为一个集合,因此,您需要迭代列表中的所有元素,因此
O(n)
您所说的“线性类型变量”是什么意思?“这是一个可忍受的吗?”弗雷德:是的,我是说iterable@DaniMesejo对不起,我是说记忆的复杂性谢谢你的回答,明白了。但是,如果我启动一个空集合,然后在循环中从列表中弹出元素,并将其逐个添加到集合中,该怎么办呢。我的内存复杂性会下降到O(1)吗?这取决于您的底层Python实现。从列表中删除元素并不一定会回收以前使用的内存。在内部,列表可能会保留调用
pop
之前分配给它的所有内存;它将被标记为可供将来调用使用(例如,
append
@BatyaGG),至少在CPython中,只列出对元素的存储引用,而set另外存储散列值。因此,即使列表能够立即释放引用的每个元素的内存,它也会减少内存使用量,而不是将元素添加到集合中会增加内存使用量。所以不是O(1)@superbrain,虽然它只代表了记忆使用量的一个恒定因素增加。@chepner-Hmm,不知道你为什么这么说。我想我们同意,但你说的好像我们不同意。而
set(list\u var)
也是“唯一”一个常数因子增加。我搞不懂你用“只”这个词。