在python中創建列表的最佳和/或最快方法


在python中,據我所知,至少有3到4種方法來創建和初始化給定大小的列表:

簡單循環append

my_list = [] for i in range(50): my_list.append(0)

簡單循環+=

my_list = [] for i in range(50): my_list += [0]

列表理解:

my_list = [0 for i in range(50)]

列表和整數乘法:

my_list = [0] * 50

在這些例子中,我認為只有列表只有50個元素會有任何性能差異,但如果我需要一個包含一百萬個元素的列表呢?使用xrange會有什么改進嗎?哪個是在python中創建和初始化列表的首選/最快方法?

 

解決方案


讓我們運行一些時間測試* timeit.timeit

>>> from timeit import timeit >>> >>> # Test 1 >>> test = """ ... my_list = [] ... for i in xrange(50): ... my_list.append(0) ... """ >>> timeit(test) 22.384258893239178 >>> >>> # Test 2 >>> test = """ ... my_list = [] ... for i in xrange(50): ... my_list += [0] ... """ >>> timeit(test) 34.494779364416445 >>> >>> # Test 3 >>> test = "my_list = [0 for i in xrange(50)]" >>> timeit(test) 9.490926919482774 >>> >>> # Test 4 >>> test = "my_list = [0] * 50" >>> timeit(test) 1.5340533503559755 >>>

如您所見,最后一種方法是迄今為止最快的方法。


但是,它應該用一成不變的物品(如整數)使用。這是因為它將創建一個列表,其中包含對同一項的引用。

以下是演示:

>>> lst = [[]] * 3 >>> lst [[], [], []] >>> # The ids of the items in `lst` are the same >>> id(lst[0]) 28734408 >>> id(lst[1]) 28734408 >>> id(lst[2]) 28734408 >>>

這種行為通常是不受歡迎的,並且可能導致代碼中的錯誤。

如果你有可變項(例如列表),那么你應該使用仍然非常快的列表理解:

>>> lst = [[] for _ in xrange(3)] >>> lst [[], [], []] >>> # The ids of the items in `lst` are different >>> id(lst[0]) 28796688 >>> id(lst[1]) 28796648 >>> id(lst[2]) 28736168 >>>

*注意:在所有測試中,我替換rangexrange由於后者返回迭代器,因此它應該總是比前者快。

 

本文首發於Python黑洞網,博客園同步更新

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM