使用StringIO作为字符串缓冲区比使用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())
Run Code Online (Sandbox Code Playgroud)
结果:
16.7872819901
18.7160351276
Run Code Online (Sandbox Code Playgroud)
Try*_*yPy 32
StringIO的主要优点是它可以在预期文件的地方使用.所以你可以这样做(对于Python 2):
import sys
import StringIO
out = StringIO.StringIO()
sys.stdout = out
print "hi, I'm going out"
sys.stdout = sys.__stdout__
print out.getvalue()
Run Code Online (Sandbox Code Playgroud)
plu*_*dra 26
如果你测量速度,你应该使用cStringIO
.
来自文档:
模块cStringIO提供类似于StringIO模块的接口.通过使用此模块中的函数StringIO(),可以更有效地使用StringIO.StringIO对象.
但是,StringIO的目的是成为一个类似文件的对象,因为当某些东西需要时,你不想使用实际的文件.
编辑:我注意到你使用from io import StringIO
,所以你可能在Python> = 3或至少2.6.单独的StringIO和cStringIO在Py3中消失了.不确定他们用于提供io.StringIO的实现.也有io.BytesIO
.
Len*_*bro 17
好吧,我不知道我是否愿意将它称为"缓冲区",你只是将字符串乘以100倍,以两种复杂的方式.这是一个简单的方法:
def meth3(string):
return string * 100
Run Code Online (Sandbox Code Playgroud)
如果我们将其添加到您的测试中:
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())
Run Code Online (Sandbox Code Playgroud)
事实证明,作为奖励更快:
21.0300650597
22.4869811535
0.811429977417
Run Code Online (Sandbox Code Playgroud)
如果你想创建一堆字符串,然后加入它们,meth1()是正确的方法.将它写入StringIO是没有意义的,这是完全不同的东西,即具有类似文件的流接口的字符串.