【パイソン] Pythonのテスト開発スタックメモリ管理機構() - 参照カウント

メモリとは何ですか

あなたは、トピックに私たちの最初のリコール、コンピュータの知識の基本原則、なぜメモリを開始する前に。我々は、すべてのコンピュータのCPUは、人間の脳と同等であることを知っているが、その動作速度が非常に高速であり、我々は、通常のような書き込みデータ、:などのドキュメント、コードは、ディスク上に格納されています。ディスクのアクセス速度は、正確に、CPUの高速動作と一致するので、中間層は、右、そして得られたメモリ、高速なメモリアクセス速度、などが挙げられるが、多くのストレージスペースの両方に適応必要としません。

のみ、例えば、ライブラリー、およびより良い理解促進、私たちの図書館の棚ディスクと同等である私たちが読むこと、それは多数の書籍を保存することができますが、棚の上の本ならば、我々は直接(非効率的)を読み取ることができません本はビューの机の点を取ることができ、それは机のメモリと同等です。

ガーベジコレクション

すべてのメモリー・リソースが制限された後、その使用後に、そうでない場合は利用可能なメモリがありませんので、いくつかの時間を実行しているシステムが麻痺され、うちリサイクルされなければなりません。我々は単にメモリを適用し、JavaやPythonの、すべてのメモリ自動復旧方法、ですが、関係なく、空きメモリの、そして定期的にトリガガベージコレクションにJVM Pythonインタプリタ:我々は2つの言語のソフトウェアのテストを使用しました。これとは対照的に、CおよびC ++は、プログラマがメモリを解放するために自由を使用して、メモリのためのmallocを使用する必要があり、mallocとfreeは、そうでない場合は非常に受けやすいメモリの問題に、ペアで表示される必要があります。

(図書を自動的に回復することができるので)机の上にライブラリーの本を読んだ後は、することができた場合にライブラリも読み取るための、新しい新入生のための場所がない、こんなに早く、上記の例を取ります。今回はライブラリアン(JVMまたはPythonインタプリタ)定期的にリサイクル図書、空の机を必要としています。棚の上でも通常の状況下で、我々はライブラリを残し、自らの空の机に、ブックバック(C言語やC ++と同様に、メモリリコール方式)。

メモリ管理のpython

参照カウント

Pythonのメモリ管理は、Pythonは、各オブジェクトは、オブジェクトの参照カウントへのポインタを保持し、参照カウントすることによって行われます。SYSライブラリは、オブジェクトの参照カウントを取得するためのPython GETREFCOUNT()関数を提供します。例で見てみましょう(注:パイソンの異なるバージョン、異なるオペレーティング結果は、私がここで使用python3.7.4です):

"""
    @author: xuanke
    @time: 2019/11/27
    @function: 测试python内存
"""
import sys

class RefClass(object):
    def __init__(self):
        print("this is init")

def ref_count_test():
    # 验证普通字符串
    str1 = "abc"
    print(sys.getrefcount(str1))
    # 验证稍微复杂点的字符串
    print(sys.getrefcount("xuankeTester"))
    # 验证小的数字
    print(sys.getrefcount(12))
    # 验证大的数字
    print(sys.getrefcount(257))
    # 验证类
    a = RefClass()
    print(sys.getrefcount(a))
    # 验证引用计数增加
    b = a
    print(sys.getrefcount(a))

    # 验证引用计数减少
    b = None
    print(sys.getrefcount(a))

if __name__ == '__main__':
    ref_count_test()

最終的な結果について考えるまず誰もがなりますか?私はそれがパイソンの異なるバージョン、変数の影響(主に再利用可能なオブジェクトが使用されている)の数を参照するので、多くの人々は、それは間違って持ってすべきだと思います。私たちはまず、の結果の原因を分析してみましょう結果を操作する投稿しました:

27
4
9
3
this is init
2
3
2

(例えば、0009上記の例のように)オブジェクトは、パラメータとして、それは余分な変数を追加するので(GETREFCOUNTに相当するが、STR1への参照を保持する)、sys.getrefcount関数が使用されているので、実際のあたり:それは事前に消去します対象物1の実際の参照カウントが減少していました。以下は、上記の下にいくつかの例を示します。

  • 文字列:文字列「ABC」は比較的単純であるため、STR1 =「ABC」は、参照番号= 26 27-1であり、実際に26インタプリタ(CPythonの)に組み込まれたPythonのがあってもよいです。対照的に、python2.7に、変数のSTR1参照番号は3-1 = 2です。文字列「xuanketester」、文字列は私の習慣で、変数のその参照番号は= 2 3-1であるので、他の追加の参照があるだろうことはできません(理由2のように、理論はゼロである必要があり、それがありますデフォルトのPythonインタプリタ)は、2つの基準のすべての文字列を保持しているため。
  • デジタル:デジタルカウンタ12の参照番号9-1に対応する基準カウント数に対応= 8、及び257主に、Pythonのための初期化処理では、-5〜作成される3-1 = 2、です256の番号は、キャッシュされ、これは頻繁にメモリ割り当てに行われ、効率を改善します。ない数字範囲の場合は、メモリ空間を再割り当てします。符号12で多重化されるように、その参照カウントが8の数(python2.7.14で、それが基準8の数をカウントする)です。
  • クラス:上記の例では、参照カウンタそれは確かにPythonインタプリタ(CPythonと)で多重化されていない、私たちのカスタムクラスオブジェクトであるため、= 1 2-1でRefClassオブジェクトを作成します。

我々は状況ウェイのメモリ・アドレスのこれらのタイプの上に印刷して確認することができます。

    def memory_address_test():
    str1 = 'xuankeTester'
    str2 = 'xuankeTester'
    print(id(str1))
    print(id(str2))

    str3 = 'abc'
    str4 = 'abc'
    print(id(str3))
    print(id(str4))

    a = 12
    b = 12
    print(id(a))
    print(id(b))

    c = 257
    d = 257
    print(id(c))
    print(id(d))

上記の我々の分析によると、C、Dはアドレスが同じではないはずであり、bが同じアドレスであり、文字列STR1 STR2、STR3 STR4とメモリアドレスは同じです。しかし、私のpycharm、直接実行PYファイルは、結果が矛盾していると、次のように予想される結果は以下のとおりです。

2854496960176
2854496960176
2854496857840
2854496857840
140724423258720
140724423258720
2854498931120
2854498931120

メモリアドレスのすべてのケースが同じで、これはなぜですか?私は、コマンドラインを実行しようとするので、結果はまだ同じで、最適化されたPYファイルにpycharmされていない考慮に入れます。最適化されたファイルのメモリアドレス上の効率PYファイルを向上させるためには、ファイルを実行するときに、私が通訳PYTHONおそらく推測する - 同じ内容のオブジェクトのメモリアドレスが同じです。

このアイデアをテストするために、私はPythonの対話モードで直接実行され、彼女は私が望む結果を得ました:

Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a=12
>>> b=12
>>> id(a)
140724423258720
>>> id(b)
140724423258720
>>> a=257
>>> b=257
>>> id(a)
2559155778384
>>> id(b)
2559155778192
>>> a='xuankeTester'
>>> b='xuankeTester'
>>> id(a)
2559155711280
>>> id(b)
2559155711280
>>>

アドレスに対応するあなたが見ることができ、上記2 257から実際には同じではない、と私たちの最初の判断が一致しています。

概要

オブジェクトを介してメモリを管理するためのPythonの参照カウントは、実際には、JavaのJVMは、私たちが土台のPythonのガベージコレクションの方法を理解ように、参照カウントを理解し、また、便利な参照カウントです。それは単に、書き込み後のpythonを紹介する記事を書かれた2件の記事を指すように、この記事では、完成したメモリ管理メカニズムPYTHON計画を提示したが、メモリの参照カウント、多くのことが書かなければならない見つけますガベージコレクションモード。

おすすめ

転載: www.cnblogs.com/zhouliweiblog/p/11946819.html