我有一个非常简单的问题:哪个更好,索引或反向索引?
例如:
list1 = [1, 2, 3]
print list1[-1]
print list1[len(list1) - 1]
现在两个print语句都打印相同的东西,但这是否意味着两个表达式都相同?
list1[-1]
)是否比索引(list1[len(list1) - 1]
)具有性能优势,还是反过来?答案 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