使用临时变量b的Python性能

2024-04-29 11:00:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道下面两个代码段是否有相同的性能。你知道吗

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

性能对于这项任务非常重要。。。你知道吗


Tags: 代码inidforifres性能temp
3条回答

没错,第一个代码将为每个迭代生成临时列表。这对于CPython(本机Python解释器)是正确的。从技术上讲,您在代码2中使用的优化称为precomputation。你知道吗

但是,如果您使用像PyPy这样的优化器,它可能会有所不同,因为它可能会检测到您的列表从未更改,从而将其存储为常量。你知道吗

不仅要在循环外创建列表,还要将其更改为set(如果它是常量,则更改为frozenset)——您将体验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

当绩效很重要时,衡量它。你知道吗

如果你不衡量绩效,你就不知道你取得了什么样的绩效。更重要的是,您不知道将来的更改是否会提高或降低性能。你知道吗

相关问题 更多 >