StringIO就是个悲剧

标签:Python

由于发现list.append()方法很慢,于是去测试了一下,顺便也弄上了StringIO,结果发现StringIO的性能太差了,还不如字符串相加。


测试取的是一个200多行50多k的网页,每次加一行来测试速度,代码如下:
from cStringIO import StringIO
from time import time
from urllib2 import urlopen

lines = urlopen('http://www.google.com/reader/shared/keakon').readlines()
size = len(lines)

def a():
  temp = []
  for line in lines:
    temp.append(line)
  return ''.join(temp)

def b():
  temp = [''] * size
  for i in xrange(size):
    temp[i] = lines[i]
  return ''.join(temp)

def c():
  temp = ''
  for line in lines:
    temp += line
  return temp

def d():
  temp = StringIO()
  for line in lines:
    temp.write(line)
  return temp.getvalue()

print a() == b() == c() == d()
t = time()
for i in xrange(10000):a()
print time() - t
t = time()
for i in xrange(10000):b()
print time() - t
t = time()
for i in xrange(10000):c()
print time() - t
t = time()
for i in xrange(10000):d()
print time() - t
结果:
True
0.609999895096
0.43700003624
0.578000068665
0.969000101089
可以看到,字符串相加的性能其实很不错,不比list慢。

顺便还在GAE上测试了一下cpu ms,分别是:
1610
1452
1504
2404
和本地测试相符。

有人会说StringIO败在创建时间上,可能是我测试的相加次数太少了,所以才慢。
其实不然,我创建1万个随机字符串来相加100次,结果是其他都在0.1秒左右,StringIO花了0.3秒。

只能对它无语了,看来平时使用时直接字符串相加才是最好的。

0条评论 你不来一发么↓

    想说点什么呢?