Python性能与临时变量

时间:2016-05-11 13:11:24

标签: python performance

我不知道以下两个片段是否具有相同的效果。

代码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,这样列表只会生成一次。

性能对于此任务非常重要......

3 个答案:

答案 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