gpt4 book ai didi

Python cStringIO 在编写上比 StringIO 花费更多的时间(字符串方法的性能)

转载 作者:太空狗 更新时间:2023-10-29 21:31:28 24 4
gpt4 key购买 nike

在我分析 python 字符串方法的方式中,我可以使用最快的方法。我有这段代码来测试文件、StringIO、StringIO 和普通字符串中的字符串连接。

#!/usr/bin/env python
#title : pythonTiming.py
#description : Will be used to test timing function in python
#author : myusuf
#date : 19-11-2014
#version : 0
#usage :python pythonTiming.py
#notes :
#python_version :2.6.6
#==============================================================================

import time
import cStringIO
import StringIO

class Timer(object):

def __enter__(self):
self.start = time.time()
return self

def __exit__(self, *args):
self.end = time.time()
self.interval = self.end - self.start

testbuf = """ Hello This is a General String that will be repreated
This string will be written to a file , StringIO and a sregualr strin then see the best to handle string according to time

""" * 1000

MyFile = open("./testfile.txt" ,"wb+")
MyStr = ''
MyStrIo = StringIO.StringIO()
MycStrIo = cStringIO.StringIO()

def strWithFiles():
global MyFile
print "writing string to file "
for index in range(1000):
MyFile.write(testbuf)
pass

def strWithStringIO():
global MyStrIo
print "writing string to StrinIO "
for index in range(1000):
MyStrIo.write(testbuf)

def strWithStr():
global MyStr
print "Writing String to STR "
for index in range(500):
MyStr = MyStr + testbuf

def strWithCstr():
global MycStrIo
print "writing String to Cstring"
for index in range(1000):
MycStrIo.write(testbuf)

with Timer() as t:
strWithFiles()
print('##Request took %.03f sec.' % t.interval)

with Timer() as t:
strWithStringIO()
print('###Request took %.03f sec.' % t.interval)

with Timer() as t:
strWithCstr()
print('####Request took %.03f sec.' % t.interval)

with Timer() as t:
read1 = 'x' + MyFile.read(-1)
print('file read ##Request took %.03f sec.' % t.interval)

with Timer() as t:
read2 = 'x' + MyStrIo.read(-1)
print('stringIo read ###Request took %.03f sec.' % t.interval)

with Timer() as t:
read3 = 'x' + MycStrIo.read(-1)
print('CString read ####Request took %.03f sec.' % t.interval)




MyFile.close()
  1. 虽然 Python 文档站点说 cStringIOStringIO 快,但结果表明 StringIO 在串联方面有更好的性能,为什么?

  2. 另一方面是,从 cStringIO 读取比 StringIO 更快(其行为类似于文件),因为我读取了 file 和 cStringIO 都在 C 中,那么为什么字符串连接很慢?

  3. 有没有其他方法可以比这些方法更快地处理字符串?

最佳答案

StringIO 表现更好的原因是在幕后,它只是保留了一个已写入的所有字符串的列表,并且只在必要时才组合它们。所以写操作就像将对象附加到列表一样简单。然而,cStringIO 模块没有这种奢侈,它必须将每个字符串的数据复制到它的缓冲区中,并在必要时调整其缓冲区的大小(这在写入大量字符串时会产生大量冗余的数据复制)数据)。

由于您正在编写大量较大的字符串,这意味着与 cStringIO 相比,StringIO 要做的工作更少。当从您写入的 StringIO 对象中读取时,它可以通过计算写入它的字符串的长度总和来优化所需的复制量,并预先分配该大小的缓冲区。

但是,StringIO 并不是连接一系列字符串的最快方法。这是因为它提供了额外的功能(寻找缓冲区的不同部分并在那里写入数据)。如果不需要此功能,您只需将列表字符串连接在一起,那么 str.join 是执行此操作的最快方法。

joined_string = "".join(testbuf for index in range(1000))
# or building the list of strings to join separately
strings = []
for i in range(1000):
strings.append(testbuf)
joined_string = "".join(strings)

关于Python cStringIO 在编写上比 StringIO 花费更多的时间(字符串方法的性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27010962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com