什么时候使用StringIO?

使用StringIO作为string缓冲区比使用list作为缓冲区慢。

什么时候使用StringIO?

from io import StringIO def meth1(string): a = [] for i in range(100): a.append(string) return ''.join(a) def meth2(string): a = StringIO() for i in range(100): a.write(string) return a.getvalue() if __name__ == '__main__': from timeit import Timer string = "This is test string" print(Timer("meth1(string)", "from __main__ import meth1, string").timeit()) print(Timer("meth2(string)", "from __main__ import meth2, string").timeit()) 

结果:

 16.7872819901 18.7160351276 

如果你测量速度,你应该使用cStringIO

从文档 :

模块cStringIO提供了一个类似于StringIO模块的接口。 大量使用StringIO.StringIO对象可以通过使用此模块中的函数StringIO()来提高效率。

但是StringIO的目的是成为一个类似文件的对象 ,因为当某些事情需要时,你不想使用实际的文件。

编辑:我注意到你使用from io import StringIO ,所以你可能在Python> = 3或至less2.6。 单独的StringIO和cStringIO在Py3中消失了。 不知道他们用什么实现来提供io.StringIO。 还有io.BytesIO

StringIO的主要优点是可以在需要文件的地方使用。 所以你可以做例如:

 import sys import StringIO out = StringIO.StringIO() sys.stdout = out print "hi, I'm going out" sys.stdout = sys.__stdout__ print out.getvalue() 

那么,我不知道我是否愿意称之为“缓冲”,你只是用两个复杂的方法把一个string乘以100次。 这是一个简单的方法:

 def meth3(string): return string * 100 

如果我们添加到您的testing:

 if __name__ == '__main__': from timeit import Timer string = "This is test string" # Make sure it all does the same: assert(meth1(string) == meth3(string)) assert(meth2(string) == meth3(string)) print(Timer("meth1(string)", "from __main__ import meth1, string").timeit()) print(Timer("meth2(string)", "from __main__ import meth2, string").timeit()) print(Timer("meth3(string)", "from __main__ import meth3, string").timeit()) 

事实certificate,作为一个奖金的方式更快:

 21.0300650597 22.4869811535 0.811429977417 

如果你想创build一串string,然后join它们,meth1()是正确的方法。 将它写入到StringIO是没有意义的,这是一个完全不同的东西,即一个具有文件stream接口的string。