Конкатенация строк в Python - Какой самый быстрый способ - PullRequest
0 голосов
/ 21 февраля 2019

Мне нужно отправить изображение через сокет, и мне нужно сделать это как можно быстрее.Изображение представлено в виде трехмерного массива.Отправляемые данные могут получить более 500000 байт.

На данный момент я делаю это так:

array_data_type = image.dtype.name
array_shape = image.shape
to_send = array_data_shape + SEPARATOR + cPickle.dumps(array_shape) + SEPARATOR + image.tobytes()
streaming_socket.sendall(to_send)

Конкатенация занимает около 0,044 с, и я хочу, чтобы она была быстрее,Это может быть быстрее?

1 Ответ

0 голосов
/ 22 февраля 2019

Используйте метод 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...