我有两个获取子列表长度的实现。性能差异很大。我想知道原因。
import time
# list with 100000 integers
with open('IntegerArray.txt') as f:
input_list = [int(x) for x in f.read().splitlines()]
i = 50000
start_1 = time.time()
len(input_list[i:])
print("--- %s seconds --- " % (time.time() - start_1))
start_2 = time.time()
len(input_list) -i
print("--- %s seconds --- " % (time.time() - start_2))
输出:
--- 0.000550985336304 seconds ---
--- 2.14576721191e-06 seconds ---
这是为什么?这是否意味着我必须避免使用第一种方法并始终使用第二种方法?
答案 0 :(得分:5)
len(input_list[i:])
这会将列表的副本从位置i复制到最后,O(n)
操作(其中n
是切片中的元素数)。然后它询问它的长度是什么:O(1)
。总的来说O(n)
。
len(input_list) -i
这只是要求长度(O(1)
)然后减去(O(1)
)。总的来说O(1)
。
答案 1 :(得分:3)
还有一个细节:在i
大于列表长度的情况下,len(input_list[i:])
将为零,但len(input_list) - i
将为负数。< / p>
这是因为切片运算符会将索引限制为数组的端点。