1

サーバー上で実行されているプログラムがある場合、どのプログラムがより多くのメモリを使用しますか?

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

ご覧のとおり、一時的にのみ役立つ変数があります。

4

2 に答える 2

2

渡さdoOperation()れた引数への独自の参照をクリアしたり、引数への参照をさらに作成したりする場合は、完了するまでdoOperation()、2つのアプローチはまったく同じです。

後者は、完了すると関数のローカル変数がクリーンアップされるため、使用するメモリが少なくなり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)
于 2013-02-08T14:47:58.587 に答える
1

値によって占有されているメモリは、値が参照されなくなったときにのみ再利用されます。あなたが与えた例を見るだけでは、doOperationが何をするのかわからないので、それらの値がいつ参照されなくなったかを知ることは不可能です。

覚えておくべきことの1つは、割り当てによって値がコピーされることはないため、名前に値を割り当てるだけではメモリ使用量が増えることはないということです。

また、実際のメモリの問題がない限り、心配する必要はありません。:)

于 2013-02-08T14:48:59.563 に答える