什么是通常认为更Pythonic /更好/更快使用,反向方法或反向内置函数?反转方法或反转内置函数有什么“更好”?
无论是在行动:
_list = list(xrange(4))
print _list
rlist = list(reversed(_list))
print rlist
_list.reverse()
print _list
什么是通常认为更Pythonic /更好/更快使用,反向方法或反向内置函数?反转方法或反转内置函数有什么“更好”?
无论是在行动:
_list = list(xrange(4))
print _list
rlist = list(reversed(_list))
print rlist
_list.reverse()
print _list
取决于您是否想扭转就地列表(即更改列表)或没有。没有其他真正的区别。
通常使用reversed
会导致更好的代码。
foo.reverse()
实际上颠倒了容器中的元素。 reversed()
实际上并不反转任何东西,它只是返回一个可用于以相反顺序遍历容器元素的对象。如果这就是你需要的,那通常比实际反转元素要快。
不知道关于性能的真实统计信息,_list.reverse()
修改列表本身,而reversed(_list)
返回一个迭代器,准备以相反的顺序遍历列表。这本身就是一个很大的差异。
如果这不是问题,object.reverse()
似乎更易读,但也许你有特定的速度要求。如果reverse()
不属于耗费资源的软件的80%,我不会打扰(作为一般的经验法则)。
似乎有很大的差异。我真的认为这是相反的。 为什么重新排列列表中的值比从迭代器创建新列表更快?
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
内存分配本身不应该花太长时间; IIRC列表是一个连续的分配(PyObject **)。更有可能的差异是因为'list(reversed(_list))',即使'list'构造函数是C代码,必须通过'reverseiterator'的API,而不是在紧密的C循环中交换指针。 –
如果他们必须检查“listreverseiterator”,那么他们必须检查所有内容......最终它会变得笨拙,并且会减慢简短的副本。此外,'反向'的常见情况是无论如何要迭代并且不需要创建一个临时的。 –
如果您对列表进行了一些操作,则图片会发生变化。比较'反转(_list):...'和'_list.reverse();我在_list:...'中,_former_有点快。 – Weidenrinde
'reversed'不复制,它返回一个迭代器。 – delnan
你是对的。我修正了它:) – elitalon