比较两种获取子列表长度的方法

时间:2015-08-02 00:57:35

标签: python

我有两个获取子列表长度的实现。性能差异很大。我想知道原因。

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 ---

这是为什么?这是否意味着我必须避免使用第一种方法并始终使用第二种方法?

2 个答案:

答案 0 :(得分:5)

len(input_list[i:])

这会将列表的副本从位置i复制到最后,O(n)操作(其中n切片中的元素数)。然后它询问它的长度是什么:O(1)。总的来说O(n)

len(input_list) -i

这只是要求长度(O(1))然后减去(O(1))。总的来说O(1)

请参阅:https://wiki.python.org/moin/TimeComplexity

答案 1 :(得分:3)

NightShadeQueen's answer是正确的。

还有一个细节:在i大于列表长度的情况下,len(input_list[i:])将为零,但len(input_list) - i将为负数。< / p>

这是因为切片运算符会将索引限制为数组的端点。