pythonパフォーマンスキラー-非効率なパフォーマンス構造

4462 ワード

「pythonで正しいデータを見つけることは非常に重要です.正しい選択は時間を節約するだけでなく、コードのメンテナンス量を減らすことができるからです」——『pythonの達人の道』
pythonを理解し、正しいデータ構造を使用し、できるだけ標準ライブラリを再利用します.
 
pythonコードのパフォーマンスを分析するにはどうすればいいですか?
①timeitモジュール
import timeit
timeit.timeit("x=sum(range(10))")

②cProfileモジュール
コマンドライン環境
python -m cProfile myscript.py各関数の呼び出し回数と経過時間を表示
python -s  time cProfile myscript.py-sは他のフィールドでソートし、
import cProfile
cProfile.run(“sum( x**2 for x in range(100)”)

 
次にいくつかの例を見ます.
例として、test 2にかかる時間はtest 1の数百倍である.
import cProfile
count=10**5
def test1():
    """append         ,  reversed  """
    nums=[]
    for i in range(count):
        nums.append(i)
    nums.reverse()
    
def test2():
    """           """
    nums2=[]
    for i in range(count):
        nums2.insert(0,i)
        
#              
cProfile.run('test1()')
cProfile.run('test2()')

例2辞書
見つからないキーに戻り値を与えるにはdictのgetメソッドを使用します.デフォルト値を指定する場合はsetdefaultを使用します.さらにcollectionsモジュールにはdeafultdictメソッドもあります.
def add_animal_in_family(species,animal,family):
    #     family ,      ,     ;  animal        
    if family not in species:
        species[family]=set()
    species[family].add(animal)

species={}
add_animal_in_family(species,"tomcat","cat")
print(species)

import collections
def add_animal_in_family(species,animal,family):
    species[family].add(animal)
#                  ,deafultfict               
#            keyerror。
species=collections.defaultdict(set)
add_animal_in_family(species,'cat','felidea')