Используйте метод join
для создания одного str
результата, а не серии временных str
объектов при оценке каждой операции +
.
to_send = SEPARATOR.join([array_data_shape, cPickle.dumps(array_shape), image.tobytes()])
Ваш текущий кодэквивалентно
tmp1 = array_data_shape + SEPARATOR
tmp2 = tmp1 + cPickle.dumps(array_shape)
tmp3 = tmp2 + SEPARATOR
to_send = tmp3 + image.tobytes()
, и каждый +
должен скопировать оба своих аргумента в новый str
, который он создает.Время выполнения является квадратичным по длине конечного результата *, в то время как SEPARATOR.join
является линейным.
* В любом случае предполагается, что вещи, к которым вы присоединяетесь, примерно равны по размеру.Строго говоря, каждый +
является линейным по размеру своих аргументов, и количество копий отдельного элемента пропорционально тому, как далеко оно осталось.Предполагая, что xi
представляет размер i
-ой строки, общая выполненная работа составляет (x1 + x2) + (x1 + x2 + x3) + ... + (x1 + x2 + ... + xn)
.