我会分配值还是直接在其他变量中使用它们?

时间:2013-02-08 14:45:04

标签: python memory-management

如果我在服务器上运行一个程序,哪一个将使用更多内存:

a = operation1()

b = operation2()

c = doOperation(a, b)

或直接:

a = doOperation(operation1(), operation2())

编辑:

1:我正在使用CPython。

2:我问的是这个问题,因为有时候,我喜欢我的代码中的可读性,所以不要写松散的操作序列,而是将它们分成变量。

EDIT2:

这是完整的代码:

class Reset(BaseHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self, uri):
    uri = self.request.uri
    try:
        debut = time.time()
        tim = uri[7:]
        print tim
        cod = yield tornado.gen.Task(db.users.find_one, ({"reset.timr":tim})) # this is temporary variable
        code = cod[0]["reset"][-1]["code"] # this one too
        dat = simpleencode.decode(tim, code)
        now = datetime.datetime.now() # this one too
        temps = datetime.datetime.strptime(dat[:19], "%Y-%m-%d %H:%M:%S") # this one too
        valid = now - temps # what if i put them all here
        if valid.days < 2:
            print time.time() - debut # here time.time() has not been set to another variable, used directly
            self.render("reset.html")
        else:
            self.write("hohohohoo")
            self.finish()
    except (ValueError, TypeError, UnboundLocalError):
        self.write("pirate")
        self.finish()

正如您所看到的,有些变量只是暂时有用。

2 个答案:

答案 0 :(得分:2)

如果doOperation()没有清除它自己对传入的参数的引用,或者创建更多对参数的引用,那么在doOperation()完成之前,这两种方法恰好是相同。

一旦doOperation()完成,后者将使用更少的内存,因为那时将清除该函数的局部变量。在第一个选项中,由于ab仍然保留引用,因此引用计数不会降至0.

CPython使用引用计数来清理不再使用的任何对象;一旦引用计数降至0,就会自动清除对象。

如果需要关注内存和可读性,可以明确删除引用:

a = operation1()
b = operation2()

c = doOperation(a, b)

del a, b

但请记住,函数内的局部变量会自动清理,因此以下内容也会导致ab引用被删除:

def foo():
    a = operation1()
    b = operation2()

    c = doOperation(a, b)

答案 1 :(得分:1)

只有在不再引用值时才会回收值占用的内存。只看你给出的例子,就不可能知道这些值何时不再被引用,因为我们不知道doOperation的作用。

要记住一件事:赋值永远不会复制值,因此仅为名称赋值不会增加内存使用量。

此外,除非您有实际的内存问题,否则不要担心。 :)