[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没有进行优化,我怎样才能重写它以便更快地运行?
答案 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())