我不知道以下两个片段是否具有相同的效果。
代码1:
for fid1 in FId1:
if fid1 in [i['FId'] for i in entity['F']]:
res.append([intId1,fid1,entity['Id'],intId2])
代码2:
temp = [i['FId'] for i in entity['F']]
tempid = entity['Id']
for fid1 in FId1:
if fid1 in temp:
res.append([intId1,fid1,tempid,intId2])
基本上,在循环中我不会改变实体。
我认为在Code1中,没有优化,它会在每个循环中生成该列表。虽然它更具可读性,但它会更慢吗?
因此我尝试存储temp,这样列表只会生成一次。
性能对于此任务非常重要......
答案 0 :(得分:3)
确切地说,第一个代码将为每次迭代生成临时列表。 CPython(本机Python解释器)也是如此。从技术上讲,您在代码2中使用的优化称为precomputation。
但是,如果你使用像PyPy这样的优化器,它可能会有所不同,因为它可以检测到这个实例你的列表永远不会改变,因此将它存储为常量。
答案 1 :(得分:2)
当表现很重要时,请测量它。
如果你不衡量表现,你就不知道自己取得了什么样的成绩。更重要的是,您不知道未来的变化是否会改善或改善表现。
答案 2 :(得分:2)
不仅在循环外创建该列表,将其更改为set(如果它是常量,则将其更改为冻结集) - 您将体验O(1)
成员资格测试时间。
>>> timeit.timeit('123456 in s', setup='s = frozenset(xrange(1000000))', number=1000)
7.14463625257622e-05
>>> timeit.timeit('123456 in l', setup='l = list(xrange(1000000))', number=1000)
2.899147340951913