在python中覆盖变量会发生什么?

时间:2013-06-07 19:19:41

标签: python python-2.7 python-3.x

我正在编写一些python代码来处理大量数据(近600万件!)。 在代码中,我使用一个巨大的for循环来处理每个集合。在那个循环中,我在每个循环中使用相同的变量并覆盖它们。当我运行该程序时,我注意到我运行它的时间越长,它就越慢。此外,经过进一步的实验,我发现如果你运行它的值10,000到10,100的速度是从0到100相同。因此我得出结论,因为我没有创建更多的变量而只是处理现有的变量,每次我覆盖一个变量,它必须通过python保存在某处。

所以: 我对吗?它必须是python保存我覆盖的地方吗? 还是我错了?还有其他事情发生了吗?

2 个答案:

答案 0 :(得分:0)

Python在保存覆盖变量之前不会复制变量的原始值。

可能你看到各种缓存对程序的影响减慢了。或者,如果要创建对象,则会调用垃圾收集器来删除不再引用的创建对象。

您是否有显示此行为的示例代码?

例如:

import hashlib
import random
import time
def test():
    t = []
    for i in xrange(20000):        
        if (i == 0) | (i==100)|(i==10000)|(i==10100):
            t.append(time.time())
        for j in range(1,10):
            a = hashlib.sha512(str(random.random()))
            b = hashlib.sha512(str(random.random()))
            c = hashlib.sha512(str(random.random()))
            d = hashlib.sha512(str(random.random()))
            e = hashlib.sha512(str(random.random()))
            f = hashlib.sha512(str(random.random()))
            g = hashlib.sha512(str(random.random()))
    print t[1]-t[0], t[3]-t[2]

然后跑了10次:

>>> for i in range(10):
        test()
0.0153768062592 0.0147190093994
0.0148379802704 0.0147860050201
0.0145788192749 0.0147390365601
0.0147459506989 0.0146520137787
0.0147008895874 0.0147621631622
0.0145609378815 0.0146908760071
0.0144789218903 0.014506816864
0.0146539211273 0.0145659446716
0.0145878791809 0.0146989822388
0.0146920681 0.0147240161896

在标准误差范围内给出几乎相同的时间(特别是如果我排除第一个区间,它必须首先初始化a,b,c,d,e,f,g)。

答案 1 :(得分:0)

Python使用引用计数来跟踪变量。删除对变量的所有引用后,该变量将被垃圾回收。然而,垃圾收集是由python根据自己的心血来潮完成的,而不是马上完成。

可能是你的代码比python垃圾收集更快,或者你的代码有问题。由于您没有提供任何代码,因此没有真正的方法可以了解。