首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引与反向索引

索引与反向索引
EN

Stack Overflow用户
提问于 2014-09-22 19:22:24
回答 2查看 138关注 0票数 1

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

例如:

代码语言:javascript
复制
list1 = [1, 2, 3]
print list1[-1]
print list1[len(list1) - 1]

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

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-22 19:29:59

请注意,与任何性能考虑无关,很明显,list1[-1]是正确的方法。它简洁,容易阅读,并直接表达你的意图.

话虽如此,以下是一些时间安排:

代码语言:javascript
复制
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]速度更快。首先,列表索引和负面列表索引没有真正的区别。主要的性能问题是索引,而不是小的转换。

代码语言:javascript
复制
%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

所以这两个版本都要做一个列表索引,所需时间差不多相同,但其中一个版本还必须先提取长度并执行减法,这在这些尺度上是很重要的。

代码语言:javascript
复制
%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
票数 2
EN

Stack Overflow用户

发布于 2014-09-22 19:24:26

当然,print list1[-1]是更好、更毕多尼的,因为在print list1[len(list1) - 1]中您调用了len函数,而且它的性能比第一次打印要低!

看到两者的真实时间:很明显你可以看到不同的!

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

代码语言:javascript
复制
~/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时间。这包括程序所进行的所有用户模式库调用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25981655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档