В моем пути к профилю строковых методов в python, чтобы я мог использовать самый быстрый. У меня есть этот код для проверки конкатенации строк в файлах, StringIO, StringIO и обычной строке.Python cStringIO занимает больше времени, чем 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()
Хотя в документации на сайте Python говорит, что
cStringIO
быстрее, чемStringIO
, но результаты говорят, чтоStringIO
имеет лучшую производительность конкатенации, почему?С другой стороны, что, читая
cStringIO
быстрее, чемStringIO
(его поведение аналогично файлу), как я прочитал выполнение файла иcStringIO
в C, так почему конкатенация медленно?Есть ли другой способ справиться со строкой быстрее, чем эти методы?
Объединение строк в коде Python, исполняемой интерпретатор CPython высоко оптимизировано, но это не обязательно переносится на вручную написанный код C в 'модуле cStringIO'. См. Первую марку в разделе [_Programming Recommend_] (https://www.python.org/dev/peps/pep-0008/#programming-recommendations) раздела PEP-8. – martineau
Спасибо за указанную ссылку было очень полезно. В моей программе профилирования операции над String имеют большую стоимость, чем StringIO, но мне любопытно, почему cStringIO занимает больше времени, чем StringIO при конкатенации строки, хотя cStringIO написан на C –