python的函数调用成本,比想象得高
2017-01-17
书中在讲到字符串是不可变对象时,提出了一个建议,把字符串相加,写成列表的join,如下:
result = a + b
改写成,
result = ''.join([a, b])
以为,这样,可以避免不可变对象的拷贝问题。其实,python的函数调用成本,比这个字符串相加,导致的拷贝成本,本高得多——感谢@冒.。O〇泡。
今天,写了一个简单的程序测试,在我的机器上,直到10个长度为15的字符串相加,还是,比10个长度为15的字符串join,运行得快。代码,贻笑大方如下:
# -*- coding:utf-8 -*-
import random
import string
import time
chars = string.letters + string.digits + string.whitespace
def generate_string(length):
s = ''
while len(s) < length:
c = chars[random.randrange(len(chars))]
if c == 'n':
c = '\n'
elif c == 'r':
c = '\r'
elif c == 'f':
c = '\f'
elif c == 'v':
c = '\v'
s += c
return s;
def f(length, count):
L = []
L2 = []
for i in xrange(10000):
row = []
while len(row) < count:
row.append(generate_string(length))
pass
line = ""+"".join(row)
L.append("rv = "%s"" % line)
line2 = "","".join(row)
L2.append("rv = ''.join(["%s"])" % line2)
text = 'n'.join(L)
text2 = 'n'.join(L2)
t1 = time.time()
exec text
print time.time() - t1
t2 = time.time()
exec text2
print time.time() - t2
if __name__ == '__main__':
f(10, 15)