2017-10-11 36 views
-1

當您運行以下代碼時,追加時間會隨着時間的推移而延長10倍。爲什麼追加大字符串時,Python中的追加操作會變慢?

from datetime import datetime 

test = [] 

for i in range(30000): 
    time_before_append = datetime.now() 
    test.append("testeafda" * 100000) 
    time_after_append = datetime.now() 
    print(time_after_append - time_before_append) 

我知道append一般是O(1)。這是否涉及垃圾回收,調整大小的列表,內存使用情況和/或其他內容?試圖瞭解Python的內部工作原理。

+2

這就像30千兆字節的字符串,你在那裏建立。你甚至有30千兆字節的RAM? – user2357112

+1

您正在一個循環中添加1 MB數據30k次,您想知道爲什麼它很慢?另外,由於字符串是不可變的,所以''testeafda「* 100000'將不得不重建字符串100,000次。如果您在循環之外預定義該字符串並將其附加到列表中,而不是重新構建每個迭代,則會立即加速。 – blakev

回答

0

我認爲這是從"testeafda" * 100000,因爲一個新的字符串被創建10000次。

即使將一個字符追加到現有字符串中,實際上也會創建一個新字符串。

0

爲什麼不使用Xrange函數(如果您使用的是Python 2.x),那麼內存管理應該有顯着的改進。喜歡;

for i in xrange(30000): 
... 
+2

與OP試圖在循環中構建的列表相比,30,000個整數列表是一個下降的桶。 – chepner