2013-02-08 26 views
1

,如果我的服务器,其中一个将使用更多的内存上运行的程序:我会分配值还是直接在其他变量中使用它们?

a = operation1() 

b = operation2() 

c = doOperation(a, b) 

或directy:

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

编辑:

1:我使用的CPython 。

2:我在问这个问题,因为有时,我在我的代码可读性的爱,所以不是写操作的looong序列,U只需将它们分割成变量。

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() 

,你可以看到有变数,只有即暂时有用。

+3

这完全取决于是否doDoperation()将存储对传入的参数的引用。 – 2013-02-08 14:45:58

+1

@MartijnPieters - 当垃圾回收器实际运行时,我想... – mgilson 2013-02-08 14:48:03

+2

@mgilson:在CPython对象在ref计数下降到0时被删除;垃圾收集器主要用于检测和破坏循环引用。 – 2013-02-08 14:50:03

回答

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

doOperation可能会在完成之前很长时间释放这些值。我们真的不知道操作如何影响内存使用。 – 2013-02-08 14:49:37

+1

@NedBatchelder:的确,它可以在函数中加入“del arg1”和“del arg2”。 – 2013-02-08 14:50:55

+0

所以我应该把所有的操作放在一次,即使可读性不好,但内存将被保存? – 2013-02-08 14:51:00

1

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

有一点要记住:从未分配的值复制,所以仅仅值分配给一个名字不会增加内存使用。

而且,除非你有一个实际的内存问题,不要担心。 :)

+1

存储本地变量的名称,当然,将使用一些内存...(如果这是在任何实际情况下相关,你几乎肯定不想使用Python) – geoffspear 2013-02-08 14:52:22

+0

,因为在python ,我找到了一个地方(不记得),它不使用assignement! – 2013-02-08 14:58:41

+1

@AbdelouahabPp:你应该阅读更多关于Python的实际工作原理。 “它不使用任务”肯定是误导...... – 2013-02-08 15:00:43

相关问题