Daevaorn
buf = StringIO( “\0” * buf_size ) buf.seek(0)
Заливка нулями при создании или в процессе перезаписи тормозит процесс. Проверено в разных вариантах.
Выводы не утешительные…
Вот результаты нового теста
1) class o.buff = 0.0469999313354
2) spisok = 0.047000169754
3) StringIO питон = 0.219000101089
4)cStringIO без заливки = 0.108999967575
5)cStringIO с заливкой = 0.140000104904
Вот сам тест (имитация конечно)
import time, StringIO, cStringIO
class SockBuff:
def __init__(self,buff=''):
self.buff=buff
if __name__=="__main__":
n = 2 #Среднее количество подкачек пакетов
m = 5000 #Количество сокетов
s = 'x' * 1020 #пакет данных
o = 'Объект'
son = 10 #проспаться 10 секунд для очистки памяти
buf_size = 1024 #размер пакета
max_buf_size = buf_size * n #размер буфера для сборки пакетов
List5 = {}
t = time.time()
#создание объектов
for i in range(0,m):
o=cStringIO.StringIO()
o.write("\0" * max_buf_size)
o.seek(0)
List5[`i`]=o
#чтение данных
for j in range(0,n):
for k in range(0,m):
o = List5[`k`]
o.write(s)
v=o.getvalue()
if len(v)>=buf_size:
x=v[:buf_size]
o.seek(0)
o.write(v[buf_size:])
dt = time.time()-t
print "5)cStringIO=",dt
del List5
time.sleep(son)
List4 = {}
t = time.time()
for i in range(0,m):
List4[`i`]=cStringIO.StringIO()
for j in range(0,n):
for k in range(0,m):
o = List4[`k`]
o.write(s)
v=o.getvalue()
if len(v)>=buf_size:
x=v[:buf_size]
o.seek(0)
o.write(v[buf_size:])
dt = time.time()-t
print "4)cStringIO=",dt
del List4
time.sleep(son)
List3 = {}
t = time.time()
for i in range(0,m):
List3[`i`]=StringIO.StringIO()
for j in range(0,n):
for k in range(0,m):
o = List3[`k`]
o.write(s)
v=o.getvalue()
if len(v)>=buf_size:
x=v[:buf_size]
o.seek(0)
o.write(v[buf_size:])
dt = time.time()-t
print "3) StringIO=",dt
del List3
time.sleep(son)
List2 = {}
t = time.time()
for i in range(0,m):
List2[`i`]=['']
for j in range(0,n):
for k in range(0,m):
o = List2[`k`]
o[0]+=s
if len(o[0])>=buf_size:
x=o[0][:buf_size]
o[0]=o[0][buf_size:]
dt = time.time()-t
print "2) spisok =",dt
del List2
time.sleep(son)
List1 = {}
t = time.time()
for i in range(0,m):
List1[`i`]=SockBuff()
for j in range(0,n):
for k in range(0,m):
o = List1[`k`]
o.buff+=s
if len(o.buff)>=buf_size:
x=o.buff[:buf_size]
o.buff=o.buff[buf_size:]
dt = time.time()-t
print "1) class =",dt
del List1
time.sleep(son)