我需要在python中执行以下操作:
我有一个元组列表
data = [("John", 14, 12132.213, "Y", 34), ("Andrew", 23, 2121.21, "N", 66)]
我有一个字段列表:
fields = ["name", "age", "vol", "status", "limit"]
数据的每个元组按顺序用于每个字段。
我有一个词典
desc = { "name" : "string", "age" : "int", "vol" : "double", "status" : "byte", "limit" : "int" }
我需要以下列格式生成要发送的消息:
[{"column": "name", "value": {"String": "John"}}, {"column": "age", "value": {"Int": 14}}, {"column": "vol", "value": {"Double": 12132.213}}, {"column": "status", "value": {"Byte": 89}}, {"column": "limit", "value": {"Int": 34}},
{"column": "name", "value": {"String": "Andrew"}}, {"column": "age", "value": {"Int": 23}}, {"column": "vol", "value": {"Double":2121.21}}, {"column": "status", "value": {"Byte": 78}}, {"column": "limit", "value": {"Int": 66}}]
我有两个生成此功能的函数:
def get_value(data_type, res):
if data_type == 'string':
return {'String' : res.strip()}
elif data_type == 'byte' :
return {'Byte' : ord(res[0])}
elif data_type == 'int':
return {'Int' : int(res)}
elif data_type == 'double':
return {'Double' : float(res)}
def generate_message(data, fields, desc):
result = []
for row in data:
for field, res in zip(fields, row):
data_type = desc[field]
val = {'column' : field,
'value' : get_value(data_type, res)}
result.append(val)
return result
然而,数据真的很大,有大量的元组(~200,000)。为每个消息生成上述消息格式需要花费大量时间。有没有一种有效的方法来做到这一点。
P.S需要这样的消息,因为我在队列中发送此消息,而消费者是需要类型信息的C ++客户端。
答案 0 :(得分:0)
列表理解应该更快。它们也简洁易懂。
Django==1.10
git+https://github.com/myaccount/myrepo.git@master#egg=some_egg
答案 1 :(得分:0)
以aydow的答案为基础并加快速度:
dt_action = {
'string': (lambda res: {'String': res.strip()}),
'byte': (lambda res: ord(res[0])),
'int': (lambda res: int(res)),
'double': (lambda res: float(res)),
}
def generate_message_faster(data, fields, desc):
return [
{'column': field, 'value': dt_action[desc[field]](res)}
for row in data for field, res in zip(fields, row)
]
时序:
6.44 µs per loop
dt_action
:5.54 µs per loop
dt_action
和列表comp:4.92 µs per loop