5

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

所以:我说的对吗?一定是python将我覆盖的东西保存在某个地方吗?还是我错了?有别的事情发生吗?

4

2 回答 2

1

Python 使用引用计数来跟踪变量。当一个变量的所有引用都被删除时,该变量将被垃圾回收。然而,垃圾收集是由 python 随心所欲地完成的,而不是马上完成。

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

于 2013-06-07T19:25:24.610 回答
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 的稍慢的第一个间隔)。

于 2013-06-07T19:24:02.683 回答