2017-10-11 39 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