dgoon@katy:~/works/pb2$ cat test.proto
message Test {
repeated uint32 id_list = 1;
};
dgoon@katy:~/works/pb2$ protoc --python_out=. test.proto
dgoon@katy:~/works/pb2$ cat test.py
import cPickle
import random
from array import array
from test_pb2 import Test
def elapsed(stmt):
import time
st = time.time()
exec(stmt)
return time.time() - st
test_arr = [r for r in xrange(100000)]
msg_pb2 = Test()
msg_pb2.id_list.extend(test_arr)
arr = array('I', test_arr)
print('pb2 ser: %5.4f' % elapsed('msg_pb2.SerializeToString()'))
print('pb2 ser-par: %5.4f' % elapsed('Test().ParseFromString(msg_pb2.SerializeToString())'))
print('pickle ser: %5.4f' % elapsed('cPickle.dumps(test_arr)'))
print('pickle ser-par: %5.4f' % elapsed('cPickle.loads(cPickle.dumps(test_arr))'))
print('array ser: %5.4f' % elapsed('arr.tostring()'))
print('array ser-par: %5.4f' % elapsed('array("I").fromstring(arr.tostring())'))
dgoon@katy:~/works/pb2$ python test.py
pb2 ser: 0.3849
pb2 ser-par: 0.9537
pickle ser: 0.0400
pickle ser-par: 0.0823
array ser: 0.0004
array ser-par: 0.0006
dgoon@katy:~/works/pb2$
그래서 결국에는, array.tostring() 을 사용해서 뽑은 문자열을 프로토콜 버퍼에 bytes 타입으로 붙여서 보낸 다음 (with packed_ prefix) 사용하는 시점에 array.fromstring()푸는 형태로 고쳤다. 일단 이렇게 속도는 잡았는데 ... ... 크흑, 귀찮아. 프로토콜 버퍼가 생성한 객체를 확장해서 써야 할 것 같다.