Python3中range(n)函数的时间复杂度

Python3中range(n)函数的时间复杂度,python,time-complexity,Python,Time Complexity,想象一下这个代码: def code(n): a = range(n) b = list(a) return b 我说得对吗 range(n)需要O(1)个时间(在Python中调用range是常数时间,对吗?) 列表(a)需要O(n)个时间,并且 return语句需要O(1)个时间 这在Python 3中是正确的;range函数返回一个惰性iterable 但是,如果您使用的是Python 2,那么range(n)也是一个O(n)操作,因为它创建了一个列表r

想象一下这个代码:

def code(n): 
    a = range(n) 
    b = list(a) 
    return b 
我说得对吗

  • range(n)
    需要O(1)个时间(在Python中调用
    range
    是常数时间,对吗?)
  • 列表(a)
    需要O(n)个时间,并且
  • return
    语句需要O(1)个时间

这在Python 3中是正确的;
range
函数返回一个惰性iterable

但是,如果您使用的是Python 2,那么
range(n)
也是一个O(n)操作,因为它创建了一个列表range(n)相当于Python 3中的
list(range(n))


return
语句需要O(1)个时间,因为它只返回对列表的引用,而不是列表的副本;
range
函数返回一个惰性iterable

但是,如果您使用的是Python 2,那么
range(n)
也是一个O(n)操作,因为它创建了一个列表range(n)相当于Python 3中的
list(range(n))


return
语句需要O(1)个时间,因为它只返回对列表的引用,而不是列表的副本。

是的,您是正确的。另外,以后只需发布普通代码,请注意,您是…是的,您是正确的。另外,以后只需发布普通代码,请注意,在Python2中,
list(range(n))
是否应该是no op?否;在Python2中,range(n)创建一个列表,然后
list(…)
仍然复制它,因此创建了两个列表(第一个是垃圾收集的)。理论上,
list
可以进行优化,这样,如果参数是一个list,并且其refcount是1,那么它就可以直接返回参数;但我不认为优化是实际执行的。啊,是的,当然。@JanChristofterasa几乎永远不会在CPython中看到这种优化(可能在PyPy之类的东西中)。最好的方法是不断折叠,有时,缓存代码中用作文本的对象,并用字节码中不可变的等价物替换它们,例如,{'foo','bar','baz'}中的
bad_word=word,然后CPython编译器将在编译时生成一个冻结集,但是你真的不应该依赖它,它是一个实现细节,而且在任何情况下,从干净的代码角度来看,它都不是一个好的实践。在Python 2中,
list(range(n))
应该是一个no op,或者不是?no;在Python2中,range(n)
创建一个列表,然后
list(…)
仍然复制它,因此创建了两个列表(第一个是垃圾收集的)。理论上,
list
可以进行优化,这样,如果参数是一个list,并且其refcount是1,那么它就可以直接返回参数;但我不认为优化是实际执行的。啊,是的,当然。@JanChristofterasa几乎永远不会在CPython中看到这种优化(可能在PyPy之类的东西中)。最好的方法是不断折叠,有时,缓存代码中用作文本的对象,并用字节码中不可变的等价物替换它们,例如,{'foo','bar','baz'}中的
bad_word=word,然后CPython编译器将在编译时生成一个冻结集,但您真的不应该依赖于它,它是一个实现细节,而且在任何情况下,从干净的代码角度来看,它都不是一个好的实践