Each time you create a new list object by concatenating. This requires copying all the items from the old list to the new one, plus one additional one. So yes, using l = l + [i] is an O (N) algorithm, not O (1).
At least do not use concatenation + ; use += extended concatenation, which is the same as list.extend() with reassignment to the same link:
def test3(): l = [] for i in range(1000): l += [i]
This gives:
>>> print timeit.repeat(stmt=test1, number=100, repeat=2) [0.1333179473876953, 0.12804388999938965] >>> print timeit.repeat(stmt=test2, number=100, repeat=2) [0.01052403450012207, 0.007989168167114258] >>> print timeit.repeat(stmt=test3, number=100, repeat=2) [0.013209104537963867, 0.011193037033081055]
source share