例如,我需要答应100行hello world,很简单的方法,就是
s = "hello world\n" print s*100
当然有时候,不可能这么简单
s = "hello world\n" for i in xrange(100): #do something s += s
如果你这么去做了,后果就只有一个,死机
先看一个我测试的列子吧
import time a = 'a'*10 b = time.time() for i in range(26): a += a print time.time()-b #大约花掉35s
时间花掉35s,另外,电脑卡的不行了,内存消耗巨大,看起来很合理的逻辑,为什么会出现这种情况呢。我们看看a += a到底是做了那些事情
首先,a+a得到一个字符串,然后把字符串赋值给a变量,同时会把之前的a变量的回收掉,所以,现在的a和之前的a并不是同一个a
a = 'aaaaaaaaaa' for i in range(10): print id(a) a += a
输出的是
3075497040
3075500944
3075461216
3075337504
3075516056
167898488
168231584
168232256
168269304
168271896
这种做法我接触过的语言都是这样处理的,简单的来说是通过拼接字符串后得到的新字符串,和原来的不是在同一个内存空间,那之前的就必须被回收掉。
for i in range(26): a += a
上面的例子会出现,不断的开辟新的内存空间,有不断的清理垃圾。java中就提供了一个StringBuffer的类,就是为了处理这种情况。
我们在编程的过程中当然不会出现这种情况,如果是这样的呢,从一个大文件里,需要把某些字符地换程另外的字符,写到另外的文件中,下面的代码很可能是一种选择
s = '' for line in open('before.txt'): line = line.replace('xx','aa') s += line+'\n' f = open('after.txt','w') f.write(s) f.close()
这个糟糕的情况就出现了
拼接字符串不在很多大牛写的程序种出现过吗,难道他们都用的不合理,不是的,这种方式只是在拼接的字符串较大,并且次数多的时候,会出现问题。
总结:有时候我们是倒在细节的脚下,因此不要小看它们。