提高python中重复代码的效率

时间:2018-05-31 03:36:30

标签: python performance optimization

我需要在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 ++客户端。

2 个答案:

答案 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_action5.54 µs per loop
  • dt_action和列表comp:4.92 µs per loop