22

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

两者都在行动:

_list = list(xrange(4))

print _list

rlist = list(reversed(_list))

print rlist

_list.reverse()

print _list
4

6 回答 6

53

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

于 2011-07-24T22:06:59.570 回答
15

似乎有很大的不同。我真的以为是反过来的。为什么重新排列列表中的值比从迭代器创建新值更快?

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

于 2011-07-24T22:23:19.427 回答
12

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

经常使用reversed会导致更好的代码。

于 2011-07-24T22:02:23.593 回答
3

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

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

于 2011-07-24T22:09:42.333 回答
1
  • _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
于 2019-11-08T04:07:09.773 回答
0

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

于 2019-08-01T11:04:46.857 回答