Protobuf вызывают блок процессора в Python - PullRequest
0 голосов
/ 01 апреля 2019

Я использую 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

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