我需要通过套接字发送图像,并且需要尽快完成。 图像表示为3d numpy数组。 发送的数据可以超过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秒,我希望它更快。可以更快吗?
答案 0 :(得分:2)
使用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)
。