反向方法或反向内置函数的“更好”是什么?

时间:2011-07-24 22:00:56

标签: python list methods reverse built-in

什么通常被认为更Pythonic /更好/更快使用,反向方法或反向内置功能?

两者都在行动中:

_list = list(xrange(4))

print _list

rlist = list(reversed(_list))

print rlist

_list.reverse()

print _list

6 个答案:

答案 0 :(得分:30)

foo.reverse()实际上会反转容器中的元素。 reversed()实际上并没有反转任何东西,它只返回一个对象,可以用来以相反的顺序迭代容器的元素。如果这就是你需要的东西,它通常比实际扭转元素更快。

答案 1 :(得分:10)

似乎有很大的不同。我真的认为这是另一回事。 为什么重新排列列表中的值比从迭代器创建新值更快?

from decorators import bench

_list = range(10 ** 6)

@ bench
def foo():
  list(reversed(_list))

@ bench
def bar():
  _list.reverse()

foo()
bar()

print foo.time
print bar.time
  

0.167278051376
  0.0122621059418

答案 2 :(得分:9)

取决于您是否要在原地反转列表(即更改列表)。没有其他真正的区别。

经常使用reversed可以获得更好的代码。

答案 3 :(得分:3)

在不知道有关性能的真实统计信息的情况下,_list.reverse()会修改列表本身,而reversed(_list)会返回一个迭代器,准备以相反的顺序遍历列表。这本身就是一个很大的不同。

如果这不是问题,object.reverse()对我来说似乎更具可读性,但也许你有特定的速度要求。如果reverse()不属于消耗资源的软件的80%,我不会打扰(作为一般的经验法则)。

答案 4 :(得分:0)

如果最终要在迭代器中修改列表以使列表不可变,并且使用不可变数据总是更好,尤其是在进行函数编程时,最好使用reversed()。

答案 5 :(得分:0)

  • _list.reverse()进行就地反转并且不返回值
  • reversed(_list)不会更改_list,但是会返回一个反向迭代 对象
  • _list [::-1]不会更改_list,但会返回反向切片

示例:

_list = [1,2,3]
ret1 = list(reversed(_list))
ret2 = _list[::-1] #reverse order slice
ret3 = _list.reverse() #no value set in ret3
print('ret1,ret2,ret3,_list:',ret1,ret2,ret3,_list)

_list = [1,2,3]
for x in reversed(_list):
    print(x)

输出:

ret1,ret2,ret3,_list: [3, 2, 1] [3, 2, 1] None [3, 2, 1]
3
2
1