【问题标题】:reversed() vs. xrange() [closed]reversed() 与 xrange() [关闭]
【发布时间】:2015-08-11 13:34:16
【问题描述】:

我需要向后遍历一个列表。我阅读了有关 xrange() 和 reversed() 的信息。哪个更贵?

【问题讨论】:

  • xrangereversed 做完全不同的事情?
  • 您是在问是否应该使用容易出错的xrange(n, -1, -1) 还是同样快的reversed(xrange(n+1))?根据%timeit,两者的速度差不多。
  • 我指向__reversed__ 的文档“如果未提供__reversed__() 方法,则内置的reversed() 将回退到使用序列协议(__len__() 和@ 987654331@)。支持序列协议的对象仅应提供__reversed__(),前提是它们可以提供比reversed()提供的实现更有效的实现。"
  • xrange 提供了__reversed__ 方法,这就是他们得分相等的原因

标签: python list traversal xrange


【解决方案1】:

您可以使用 Python 的 timeit 库来计时这样的事情。你没有说你有什么样的列表,所以我假设一个简单的字符串列表。首先,我创建一个包含 100 个项目的列表,然后对两者进行计时:

my_list = ["hello"] * 100

def v1():
    for x in my_list[::-1]:
        pass

def v2():
    for x in reversed(my_list):
        pass

print timeit.timeit(v1)
print timeit.timeit(v2)

这给出了以下结果:

2.78170533583
2.13084949985

如您所见,在此示例中,reversed() 的速度要快一些。

【讨论】:

  • 如果列表创建在测量范围内,则无用。 (否则 +1)
  • 确实,很好看。
  • 新手,非常清楚,天哪,了解了timeit。谢谢!我确实在使用简单的列表。作为后端实现,我需要知道哪个花费更少的时间。所以,很清楚。
【解决方案2】:

xrange() 产生一个数字序列。然后,您可以根据需要将这些数字用作列表索引,或者您可以将它们用于任何您想要这些数字的地方。

for i in xrange( len(l)-1, -1, -1):
    item = l[i]
    print item

reversed() 从具有长度且可以被索引的东西中生成项目。

for item in reversed(l):
    print item

我会使用reversed(),因为它使您的代码更短、更简单、更清晰,并且更容易正确编写。

【讨论】:

  • 您也可以使用生成器for item in (l[i] for i in xrange(len(l)-1, -1, -1)): ...。 (注意:可能会导致其他人在必须阅读代码时讨厌你。)
  • 确实......然后你可以将你的生成器放在一个函数中并调用它 reversed()。 :)
猜你喜欢
  • 2015-02-24
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2013-09-11
相关资源
最近更新 更多