Python近年来非常火,特别是数据挖掘和机器学习领域。
对于由C/C++语言等比较看重时间复杂度的语言(毕竟是用于编写底层的)学习过来的人,当然在Python使用中会注意到时间复杂度的问题。
最近在使用for循环就想到了一个问题:
从0遍历到n(不包括n)我们都会写:
Python:
for i in range(n):
C:
for(int i = 0;i <n;i++){}
那么它们的时间复杂度会不会不同,毕竟上面Python的有个range(n)
而下面的C代码是一个确定的变量n;换句话说就是for遍历时range(n)是不是产生一个列表然后给i遍历,时间复杂度会不会变成O(2n)而不是C/C++的O(n)?
后来在菜鸟教程查到了range()函数的介绍:
- “Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。”所以并不会额外产生O(n)的时间
- Python3 list() 函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。
- Python2 range() 函数返回的是列表。
故for i in range(n)循环遍历时间复杂度是O(n),因为range(n)并不会产生所谓“用于遍历的列表”而耗时。
另外如果有其他意见欢迎讨论和指出。