Python辞書、リスト、ジェネレーター

Pythonノート

プログラミング言語の効率に関しては、一般的に開発効率と運用効率を指します。言語が異なれば焦点も異なります。Python言語は間違いなくコーディング効率を重視します。質問をブラッシングする感覚から、さまざまなケースで、PythonはC ++またはCよりも数倍から数十倍遅いです。しかし、プログラマーとして、あなたは何が起こっているのかだけでなく、その理由も知っている必要があります。いくつかの理由を以下に示します(それぞれが非常に詳細であり、現時点では明確に理解していません):
最初:Pythonは動的言語
です。変数が指すオブジェクトのタイプは実行時に決定されます。コンパイラー予測することはできません。最適化する方法はありません。簡単な例を挙げてみましょう。r= a + baとbが追加されますが、aとbのタイプは実行時にのみ認識されます。追加操作の場合、タイプごとに処理が異なるため、実行されるたびにaが判断されます。そしてbを入力し、対応する操作を実行します。C ++やJavaなどの静的言語では、コンパイル時にランタイムコードが決定されます。
2番目:Pythonは解釈および実行されますが、JITをサポートしていません(後で最適化するためにPypyインタープリターを使用します。Pypyにはこの種のジャストインタイムコンパイラ実装があります)
3番目:Pythonのすべてがオブジェクトであり、オブジェクトを維持する必要があります参照カウントは余分な作業を追加します。
4番目:python GIL(グローバルインタープリターロック)
は本質的に相互排他ロックです。相互排他ロックであるため、すべてのミューテックスの本質は同じです。これらはすべて、同時操作をシリアルに変換し、同時に共有を制御します。データデータのセキュリティを確保するために、1つのタスクでのみ変更できます。GILが存在するため、同じプロセスで同時に実行されるスレッドは1つだけです(マルチコアは使用できません)。GILはインタープリターレベルでデータを保護します。ユーザー自身のデータを保護するには、自分でロックする必要があります。
5番目:ガベージコレクション(Pythonのすべてがオブジェクトであり、参照カウントが0の場合、オブジェクトの寿命は終わります)
参照カウントメカニズムの利点:1。シンプル。2.リアルタイム:参照がなくなると、メモリは直接解放されます。他のメカニズムのように特定の時間を待つ必要はありません。リアルタイムの性質には利点もあります。メモリの処理と再利用の時間は通常の時間に割り当てられます。
参照カウントメカニズムのデメリット:
1。参照カウントを維持するとリソースが消費されます
2.循環参照:
list1
= []
list2 = [] list1.append(
list2 list2.append(list1)
list1とlist2は、存在する場合、相互に参照します。他のオブジェクトペアはありません。それらの参照、list1とlist2の参照カウントは1のままであり、占有されているメモリを再利用することはできません。


辞書とリスト

ハッシュテーブルはPython辞書で使用されるため、検索操作の複雑さはO(1)であり、リストは実際には配列です。リストでは、検索はリスト全体をトラバースする必要があり、複雑さはO( n)なので、メンバーを検索するリストよりも辞書やその他の操作にアクセスする方が高速です。実際の操作では、list = dict.fromkeys(list、True)は、辞書に変換した後のクエリ速度を向上させるためによく使用されます。
2.セットとリスト:
リスト、和集合、または差異の共通部分を見つける必要がある場合は、セットに変換して操作できます。
すべての言語に適用可能なSet(lista)&set(listb)ループ最適化:ループの外側に長さの計算を追加します。
3.文字列の最適化:
文字列の連結の使用では、+の代わりにjoin()を使用してみてください。Pythonの文字列オブジェクトは不変であるため、スプライシング、変更などの文字列操作は新しい文字列オブジェクトを生成し、パフォーマンスに影響を与えます。
4.リスト内包表記とジェネレータ式の使用:
通常、リスト
内包表記は、質問をブラッシングするときにリストを生成するために使用されます。ただし、メモリの制限により、リストの容量は確実に制限されるため、大量のデータのジェネレータ式リスト分析: cond_exprの場合はiterableのiter_varのexpr]
ジェネレータ式:(cond_exprの場合はiterableのiter_varのexpr)


a,b = b,a # 交换变量
a = 'hello, world!'	a[::-1] # 翻转
a = ['hello', 'world']		 " ".join(a)     # hello world" 拼接字符串
a = [1, 1, 1, 2, 3 ,4 ,4, 5] 	a = list(set(a))        # [1, 2, 3, 4, 5] 列表去重
# 复制列表	
import copy	
a = [1,'a',['x']]
# 浅复制
b = copy.copy(a)
b = a[:]
b = list(a) # 使用工厂函数
# 深复制
b = copy.deepcopy(a)"

ood_list = [i for i in xrange(1,101) if i % 2 == 1] # 列表推导
# 字典推导式 快速更换k,v
mcase = {
    
    'a': 10, 'b': 34}
mcase_frequency = {
    
    v: k for k, v in mcase.items()}
# 读写文件	
with open('/path/to/file', 'r') as f: 
    do something...

おすすめ

転載: blog.csdn.net/Pioo_/article/details/107466588