Я использую protobuf в python2.7.
если я добавлю неиспользуемую переменную, такую как "sssssss = [{'a': 1}, {'b': 2}] * 10000000", то функция protobuf, такая как "add" или "extension", иногда будет стоить гораздо больше времени.
если я делаю переменную sssssss, это будет нормально.
чем больше памяти я стою, тем больше времени будет
кто может ответить на мое предложение?
спасибо
Protobuf:
syntax = "proto3";
option go_package = "pb/pushmessage";
package hslevel2quote;
message FieldMapEntry {
string Key = 1;
string Value = 2;
}
message CodeMapEntry {
string Code = 1;
repeated FieldMapEntry FieldMap = 2;
}
message StreamResponse {
string ServerId = 1;
string SendTime = 2;
repeated CodeMapEntry CodeItem = 3;
repeated FieldMapEntry FieldItem = 4;
}
message StreamRequest {
int32 Type = 1;
int32 Version = 2;
}
Код:
FIELD_SEQ_MAP = {
'order_bid': '52',
'order_ask': '53',
'broker_buy': '54',
'broker_sell': '55',
'mingxi': '56',
}
FIELD_SEQ_VALUE = FIELD_SEQ_MAP.values()
def make_stream_response(all_data):
response = pushmessage_pb2.StreamResponse()
response.ServerId = "hkLevel2PushServer"
response.SendTime = time.strftime("%Y-%m-%d %H:%M:%S")
for stock_code, data_map in all_data.items():
stock_code = 'hk' + stock_code
code_entry = response.CodeItem.add()
code_entry.Code = stock_code
for key, data in data_map.items():
try:
if FIELD_SEQ_MAP.has_key(key):
# value = cjson.encode(data)
if key in ['order_bid', 'order_ask']:
value = ','.join(['/'.join(['%s' % v for v in d]) for d in data])
else:
value = ','.join(data)
field_entry = code_entry.FieldMap.add()
field_entry.Key = FIELD_SEQ_MAP[key]
field_entry.Value = value
elif key == 'qt':
for seq, value in data.items():
if seq not in FIELD_SEQ_VALUE:
field_entry = code_entry.FieldMap.add()
field_entry.Key = seq
field_entry.Value = value
except Exception as e:
log.msg('HK_LEVEL2', 'ERROR',
'make_code_entry error key[%s], value[%s], error[%s]' % (key, data, vosExcept.exceptMsg()))
continue
return response
def test():
import cjson
sssssss = [{'a': 1}, {'b': 2}] * 10000000
with open('alldata.txt', 'r') as f:
content = f.read()
line_list = content.split("\n")
for i in xrange(1, 100):
for line in line_list:
try:
time1 = int(time.time() * 1000)
info = cjson.decode(line)
make_stream_response(info)
time2 = int(time.time() * 1000)
print len(info), time2 - time1
except Exception as e:
continue
if __name__ == '__main__':
test()
env: python2.7, protobuf3.5.1