索引与反向索引

时间:2014-09-22 19:22:25

标签: python indexing

我有一个非常简单的问题:哪个更好,索引或反向索引?

例如:

list1 = [1, 2, 3]
print list1[-1]
print list1[len(list1) - 1]

现在两个print语句都打印相同的东西,但这是否意味着两个表达式都相同?

  • 执行代码时如何评估它们?
  • 使用反向索引(list1[-1])是否比索引(list1[len(list1) - 1])具有性能优势,还是反过来?

2 个答案:

答案 0 :(得分:3)

肯定print list1[-1]更好,更强 pythonic ,因为在print list1[len(list1) - 1]中你调用了len函数,它的性能低于第一次打印!

看到两者的实时时间:显然你可以看到差异!

请注意, sys是程序使用的系统CPU时间。这仅包括内核系统调用,而不包括任何用户库调用。

~/Desktop $ time python -c print  list1[len[1,2,3] - 1]


real    0m0.022s
user    0m0.019s
sys     0m0.004s
~/Desktop $ time python -c print  list1[-1]


real    0m0.013s
user    0m0.004s
sys     0m0.008s

真实是程序开始和结束之间经过的总时间。

用户是程序使用的用户CPU时间。这包括程序所做的所有用户模式库调用。

答案 1 :(得分:2)

请注意,独立于任何性能考虑因素,很明显list1[-1]是正确的方法。它简洁,易于阅读,并直接表达您的意图。

那就是说,这里有一些时间:

list1 = [1, 2, 3]
list2 = [random.randint(1, 20) for _ in range(20000)]

%timeit list1[-1]
# 10000000 loops, best of 3: 51.6 ns per loop
%timeit list1[len(list1)-1]
# 10000000 loops, best of 3: 146 ns per loop

%timeit list2[-1]
# 10000000 loops, best of 3: 52.4 ns per loop
%timeit list2[len(list1)-1]
# 10000000 loops, best of 3: 148 ns per loop

很明显为什么list1[-1]更快。首先,列表索引和否定列表索引之间没有真正的区别。主要的性能问题是索引,而不是一个小的转换。

%timeit list2[-1]
# 10000000 loops, best of 3: 52.4 ns per loop
%timeit list2[19999]
# 10000000 loops, best of 3: 47.1 ns per loop

因此,两个版本都必须执行一个大约需要相同时间的列表索引,但其中一个版本也必须首先提取长度并执行减法,这在这些尺度上是非常重要的。

%timeit len(list2)
# 10000000 loops, best of 3: 71 ns per loop
% timeit 20000 - 1
# 100000000 loops, best of 3: 14.9 ns per loop