Pythonプログラムのパフォーマンスを向上させる6つの知識点をいくつか身につけてみましょう
1836 ワード
1、ローカル変数の使用
グローバル変数の代わりにローカル変数を使用する:メンテナンスが容易で、パフォーマンスが向上し、メモリが節約されます.
モジュール名空間の変数(ls=os.linesepなど)をローカル変数で置き換えます.一方、プログラムの性能を高めることができ、ローカル変数の検索速度がより速い.一方、冗長なモジュール変数の代わりに短い識別子を使用することで、可読性が向上します.
2、関数呼び出し回数を減らす
オブジェクトタイプ判定ではisinstance()が最適であり,オブジェクトタイプアイデンティティ(id())に次いで,オブジェクト値(type()が最適である.
繰り返し操作の内容をパラメータとしてループ条件に置かないで、繰り返し演算を避けます.
モジュールXの関数またはオブジェクトYを使用する場合は、import Xではなくfrom X import Yを直接使用します.X.Y.これにより、Yを使用する場合、クエリーを1回減らすことができます(解釈器は、まずXモジュールを検索し、Xモジュールの辞書でYを検索する必要はありません).
3、マッピング代替条件で検索
マッピング(dictなど)の検索速度は、ifなどの条件文よりはるかに速い.Pythonにもselect-case文はありません.
4、直接反復シーケンス要素
シーケンス(str、list、tupleなど)については、シーケンス要素を直接反復し、反復要素のインデックス速度よりも高速です.
5、ジェネレータ式によるリスト解析の代替
リスト解析(list comprehension)は、リスト全体を生成し、大量のデータの反復に悪影響を及ぼします.
ジェネレータ式は、本当にリストを作成するのではなく、必要に応じて値(遅延計算)を生成し、メモリに優しいジェネレータを返します.
6、コンパイル後に呼び出す
eval()、exec()関数を使用してコードを実行する場合は、strを直接呼び出すのではなく、コードオブジェクト(compile()関数でバイトコードにコンパイル)を呼び出すことが望ましい.複数回のコンパイルプロセスを実行することを回避し、プログラムのパフォーマンスを向上させることができる.
正規表現モードマッチングも同様であり、正規表現モードをregexオブジェクト(re.complie()関数を介して)にコンパイルしてから比較とマッチングを実行することも望ましい.
プラス
グローバル変数の代わりにローカル変数を使用する:メンテナンスが容易で、パフォーマンスが向上し、メモリが節約されます.
モジュール名空間の変数(ls=os.linesepなど)をローカル変数で置き換えます.一方、プログラムの性能を高めることができ、ローカル変数の検索速度がより速い.一方、冗長なモジュール変数の代わりに短い識別子を使用することで、可読性が向上します.
2、関数呼び出し回数を減らす
オブジェクトタイプ判定ではisinstance()が最適であり,オブジェクトタイプアイデンティティ(id())に次いで,オブジェクト値(type()が最適である.
# num
type(num) == type(0) #
type(num) is type(0) #
isinstance(num,(int)) #
繰り返し操作の内容をパラメータとしてループ条件に置かないで、繰り返し演算を避けます.
# len(a)
while i < len(a):
statement
#len(a)
m = len(a)
while i < m:
statement
モジュールXの関数またはオブジェクトYを使用する場合は、import Xではなくfrom X import Yを直接使用します.X.Y.これにより、Yを使用する場合、クエリーを1回減らすことができます(解釈器は、まずXモジュールを検索し、Xモジュールの辞書でYを検索する必要はありません).
3、マッピング代替条件で検索
マッピング(dictなど)の検索速度は、ifなどの条件文よりはるかに速い.Pythonにもselect-case文はありません.
#if
if a == 1:
b = 10
elif a == 2:
b = 20
...
#dict ,
d = {1:10,2:20,...}
b = d[a]
4、直接反復シーケンス要素
シーケンス(str、list、tupleなど)については、シーケンス要素を直接反復し、反復要素のインデックス速度よりも高速です.
a = [1,2,3]
#
for item in a:
print(item)
#
for i in range(len(a)):
print(a[i])
5、ジェネレータ式によるリスト解析の代替
リスト解析(list comprehension)は、リスト全体を生成し、大量のデータの反復に悪影響を及ぼします.
ジェネレータ式は、本当にリストを作成するのではなく、必要に応じて値(遅延計算)を生成し、メモリに優しいジェネレータを返します.
# f
#
l = sum([len(word) for line in f for word in line.split()])
#
l = sum(len(word) for line in f for word in line.split())
6、コンパイル後に呼び出す
eval()、exec()関数を使用してコードを実行する場合は、strを直接呼び出すのではなく、コードオブジェクト(compile()関数でバイトコードにコンパイル)を呼び出すことが望ましい.複数回のコンパイルプロセスを実行することを回避し、プログラムのパフォーマンスを向上させることができる.
正規表現モードマッチングも同様であり、正規表現モードをregexオブジェクト(re.complie()関数を介して)にコンパイルしてから比較とマッチングを実行することも望ましい.
プラス
qq qun 834 179 ‰ 111
無料Python学習資料