什麼是通常認爲更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