优化Python列表理解

时间:2016-07-28 05:18:21

标签: python

[getattr(x, contact_field_map[communication_type])
                            for x in curr_role_group.contacts if
                            getattr(x, contact_field_map[communication_type])]

以上是我的列表理解。初始函数和filter子句调用getattr两次。 Python会运行两次还是在内部优化计算,知道它可以在第一次调用后缓存结果?

如果Python没有进行优化,我怎样才能重写它以便更快地运行?

3 个答案:

答案 0 :(得分:3)

Python将运行getattr两次 - 它没有进行任何优化(毕竟,它如何知道第一个属性获取不会改变第二个属性的值? )

要优化查询,您可以分两个阶段完成。第一阶段使用生成器表达式计算值,第二阶段过滤这些值:

gen = (getattr(x, contact_field_map[communication_type])
                        for x in curr_role_group.contacts)
result = [item for item in gen if item]

答案 1 :(得分:1)

尝试一下:

[res for x in curr_role_group.contacts 
     for res in [getattr(x, contact_field_map[communication_type])] if res]

例如,而不是

[i**2 for i in range(10) if i**2 < 10]
Out: [0, 1, 4, 9]

你可以做到

[res for i in range(10) for res in [i**2] if res < 10]
Out: [0, 1, 4, 9]

在这里,您只计算一次i**2

答案 2 :(得分:0)

你可以为整个事情使用发电机吗?类似的东西:

def gen():
   for x in curr_role_group.contacts:
       value = getattr(x, contact_field_map[communication_type])
       if value:
           yield value

result = list(gen())