Pythonのリストとメタグループのストレージ方式と性能の違い、使用するシーン

22812 ワード

Pythonのリストとメタグループの使用
一、リストとメタグループの基礎:
リストとメタグループは、任意のデータ型を配置できる秩序化された集合です.
多くの言語では、集合のデータ型が一致する必要があります.ただし、Pythonのリストとメタグループについては、この要件はありません.
my_list = [66, 77, 'fe', 'cow']  #        int string     
print(my_list)
#     : [66, 77, 'fe', 'cow']

my_tuple = ('fe_cow', 666) #        int string     
print(my_tuple)
#      ('fe_cow', 666)

では、それらの間にはどんな違いがありますか?
リストはダイナミックです.長さのサイズが固定されず、要素を任意に追加、削除、または変更できます.
メタグループは静的です.長さは固定されており、削除や変更を増やすことはできません.
次に栗を挙げます.
  • は、それぞれリストとメタグループを作成します.リストに最後の要素を簡単に追加できますが、同じ操作のメタグループはエラーを報告します.
    my_list = [1, 2, 3, 4]
    my_list[3] = 5  # python      0       my_list[3]              
    print(my_list)
    #     : [1, 2, 3, 5]
    
    my_tuple = (1, 2, 3, 4)
    my_tuple[3] = 5
    print(my_tuple)
    #     :
    Traceback (most recent call last):
    	File "", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    
    既存のメタグループを「変更」したい場合は、です.
    my_tuple= (1, 2, 3)
    new_tuple = my_tuple + (4, )
    print(new_tuple)
    #  (1, 2, 3, 4)
    

  • Pythonのリストとメタグループは、負のインデックスをサポートしています.
    //        
    my_list = [1, 2, 3, 4]
    my_list[-1]
    4
    
    //        
    my_tuple = (1, 2, 3, 4)
    
    my_tuple[-2]
    3
    

    -1は最後の要素を表し、-2は最後から2番目の要素を表します.
    Pythonリストとメタグループはスライス操作をサポートしています.
    //       
    my_list = [1, 2, 3, 4]
    my_list[1:3]
    [2, 3]
    
    //       
    my_tuple = (1, 2 ,3 ,4)
    my_tuple[1:3]
    (2, 3)
    

    インデックスは1から2までで、簡単に理解できます:“前閉じてから開きます”
    Pythonはlist()とtuple()関数で相互変換できます.
    //        
    list((1, 2, 3))
    [1, 2, 3]
    
    //        
    tuple([1, 2, 3])
    (1, 2, 3)
    

    Pythonリストとメタグループの一般的な組み込み関数:
    //     
    my_list = [3, 2, 3, 7, 8, 1]
    my_list.count(3) 
    2
    
    my_list.index(7)
    3
    
    my_list.reverse()
    my_list
    [1, 8, 7, 3, 2, 3]
    
    my_list.sort()
    my_list
    [1, 2, 3, 3, 7, 8]
    
    //     
    my_tuple = (3, 2, 3, 7, 8, 1)
    my_tuple.count(3)
    2
    
    my_tuple.index(7)
    3
    
    list(reversed(my_tuple))
    [1, 8, 7, 3, 2, 3]
    
    sorted(my_tuple)
    [1, 2, 3, 3, 7, 8]
    
  • count(item):統計リスト/メタグループにitemが表示された回数を示します.
  • index(item):リスト/メタグループにitemが初めて現れるインデックスを返します.
  • list.reverse()とlist.sort()は,それぞれその場逆転リストと並べ替えを表す.
    注意、メタグループにはこの2つの関数が内蔵されていません.メタグループをリストに変換してこの関数の操作を行う必要があります.

  • reversed()とsorted()は、リスト/メタグループを逆転およびソートすることを示しますが、逆転後または順序付けされた / が返されます.
    二、リストとメタグループの保存方式の違い:
    //   __sizeof__()        
    my_list = [1,2 ,3 ,4]
    my_list.__sizeof__()
    72
    
    my_tuple = (1, 2, 3, 4)
    my_tuple.__sizeof__()
    56
    

    同じ要素が配置されているのに、メタグループが格納する空間はリストより 16 であることがわかります.どうしてですか.理由は次のとおりです.
  • リストは動的であるため、対応する要素(int型、8バイト)を指すために が必要である.
  • リストは可変なので、でリスト空間の使用状況をリアルタイムで追跡できるように、割り当てられた長さサイズ(8バイト)を追加で格納する必要があります.
  • リスト空間割付手順は、以下に説明する:
    my_list = []
    my_list.__sizeof__() //          40  
    40
    my_list.append(1)
    my_list.__sizeof__() 
    72 //      1  ,           4       (72 - 40)/8 = 4
    
    #       4   
    my_list.append(2) 
    my_list.__sizeof__()
    72 //          ,      2,      
    
    my_list.append(3)
    my_list.__sizeof__() 
    72 //     3,      
    
    my_list.append(4)
    my_list.__sizeof__() 
    72 //     4,      
    
    my_list.append(5)
    my_list.__sizeof__() 
    104 //     5  ,       ,            4      
    
    リストの追加/削除操作のたびにスペース割り当てのオーバーヘッドを減らすために、Pythonはスペースを割り当てるたびに、追加的に割り当てます.
    このようなメカニズムは、その操作の効率性を保証する:時間の複雑さを増加/削除する0(1);
  • は、タプルにとって , , である.

  • 三、リストとメタグループの性能:
    上記の両者間の記憶方式の違いから,と結論した.
    Pythonのバックグラウンドでは、静的データをいくつかのリソースキャッシュします.ごみ回収メカニズムが存在するため、一部の変数が使用されない場合、Pythonは使用したメモリを回収し、他の変数や他のアプリケーションで使用できるようにオペレーティングシステムに返却します.
    メタグループなどの静的変数では、使用されず、スペースが少ない場合、Pythonはメモリの一部を一時的にキャッシュします.次に同じサイズのメタグループを作成すると、Pythonはオペレーティングシステムに要求することなく、メモリを直接探すことができ、前にキャッシュしたメモリスペースを直接割り当てることができ、プログラムの実行速度を大幅に速めることができます.
    四、リストとメタグループの使用シーン:
  • 格納されている が、データをフロントエンドレンダリングに直接伝える必要がある場合は、メタグループを選択するのが適切であることは間違いありません.
    //           
    def get_location():
    	.....     
    	return (longitude, latitude)
    
  • は、 が格納されている場合、リストを使用するのがより適切である.
    //                  
    teacher_list = []  //       
    result = DB(teacherID)  //                 ,    QuerySet
    for item in result:
    	teacher_list.append(item)
    

  • 五、まとめ:
    リストとメタグループは順序付けされており、任意のデータ型の集合を格納できます.主な違いは次のとおりです.
  • リストはダイナミックで、長さは可変で、要素を任意に追加、削除、または変更することができます.
    リストの記憶領域はメタグループよりやや大きく、性能はメタグループよりやや劣っている.
  • メタグループは静的で、長さは固定されており、要素を増加、削除、または変更することはできません.
    メタグループはリストより軽量級で、性能がやや優れている.

  • 六、list()、効率と何か違いがありますか?
    違いは次のとおりです.
  • list()は であり、Python関数呼び出しは を作成し、一連のパラメータチェックの操作を行う.
  • []は C であり、直接呼び出すことができるため、効率が高い.