Pythonのパフォーマンスチューニングのための10のヒント まとめ
1 リストジェネレータをもっと頻繁に使用する
以下のコードを置き換えてください。
cube_numbers = []
for n in range(0,10):
if n % 2 == 1:
cube_numbers.append(n**3)
リスト・ジェネレーティブのために書かれたもの。
cube_numbers = [n**3 for n in range(1,10) if n%2 == 1]
2 内蔵機能
以下のビルトイン機能は、できるだけ多く使用してください。
3 可能な限りジェネレータを使用する
ジェネレーターは、1台のマシンで大量のデータを扱う場合、以下のウェブクロールのように、小さなスライスで一度に読み込み、メモリの節約を最大化するため、しばしば有用である。
yield
import requests
import re
def get_pages(link):
pages_to_visit = []
pages_to_visit.append(link)
pattern = re.compile('https?')
while pages_to_visit:
current_page = pages_to_visit.pop(0)
page = requests.get(current_page)
for url in re.findall('<a href="([^" rel="external nofollow" ]+)">', str(page.content)):
if url[0] == '/':
url = current_page + url[1:]
if pattern.match(url):
pages_to_visit.append(url)
# yield
yield current_page
webpage = get_pages('http://www.example.com')
for result in webpage:
print(result)
for name in member_list:
print('{} is a member'.format(name))
4 メンバーの所属を決定する最も早い方法は、in.
a = [1,2,3,4,5]
b = [2,3,4,5,6]
overlaps = []
for x in a:
for y in b:
if x==y:
overlaps.append(x)
print(overlaps)
5 集合を使って交点を求める
以下のコードを置き換えてください。
a = [1,2,3,4,5]
b = [2,3,4,5,6]
overlaps = set(a) & set(b)
print(overlaps)
交点を設定し、求めるように修正する。
first_name, last_name, city = "Kevin", "Cunningham", "Brighton"
6 複数回の割り当て
Pythonは多重代入スタイルをサポートしているので、より頻繁に使用することができます。
import itertools
iter = itertools.permutations(["Alice", "Bob", "Carol"])
list(iter)
7 グローバル変数の使用は控えめに
Pythonはローカル変数を見つけるのが最も速く効率的です。グローバル変数を見つけるのはかなり遅くなるので、ローカル変数を多く使い、グローバル変数を少なくしましょう。
8 効率的なitertoolsモジュール
itertoolsモジュールは複数のイテレータ操作をサポートし、最もメモリ効率の良い書き方を提供するので、次のように3つの要素の完全な順列を求めるために頻繁に使用します。
lru_cache
9 lru_cacheキャッシュ
functools モジュールの
import functools
@functools.lru_cache(maxsize=128)
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
return fibonacci(n - 1) + fibonacci(n-2)
このデコレータはキャッシュ関数を提供し、次のように n 番目のフィボナッチ数列の再帰的解法と組み合わせます。
def fibonacci(n):
if n == 0: # There is no 0'th number
return 0
elif n == 1: # We define the first number as 1
return 1
return fibonacci(n - 1) + fibonacci(n-2)
したがって、以下の再帰的な書き出しは非常に非効率で、複数のサブ問題を繰り返し解くことに悩まされます。
key
10 組み込み関数、キー、アイテムゲッター
上記の組み込み関数は可能な限り使用され、リストのソートには以下のように使用されます。
operator.itemgetter
および
import operator
my_list = [("Josh", "Grobin", "Singer"), ("Marco", "Polo", "General"), (" Ada", "Lovelace", "Scientist")]
my_list.sort(key=operator.itemgetter(0))
my_list
:
import operator
my_list = [("Josh", "Grobin", "Singer"), ("Marco", "Polo", "General"), (" Ada", "Lovelace", "Scientist")]
my_list.sort(key=operator.itemgetter(0))
my_list
テクニカルコミュニケーション
再掲載、ブックマーク、応援などお気軽にどうぞ
Pythonのパフォーマンスチューニングのための10のヒントに関するこの記事は以上です。Pythonのパフォーマンスチューニングの詳細については、Script Houseの過去の記事を検索するか、以下の記事を引き続きご覧ください。
関連
-
[解決済み】Pythonのロガーがログファイルに加えて標準出力にも全メッセージを出力するようにする。
-
[解決済み] TypeError: NoneTypeではなく、strでなければならない。
-
[解決済み] なぜnumpyでは負の累乗にできないのですか?
-
[解決済み] Pythonで文字列の引き算をする方法
-
[解決済み] websocket' という名前のモジュールがない
-
[解決済み] Pythonにおけるミューテックスの適切な使用法
-
[解決済み] Sqlalchemyでenumを行うための最良の方法?
-
[解決済み] TypeError: ディクショナリーへのインデックス作成時、'type' オブジェクトは添え字になりません。
-
[解決済み] Python: urllib.error.HTTPError: HTTP Error 404: 見つかりません
-
ImportError: DispatcherMiddlewareという名前をインポートできないエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ZeroDivisionErrorの取得:Pythonのfloat除算
-
[解決済み】Python3エラー。TypeError: 暗黙のうちに 'bytes' オブジェクトを str に変換できない
-
[解決済み】Python 3.5とAnacondaを使用してモジュールcPickleが見つかりません。
-
Tensorflowのエラー.TypeError: ハッシュ化できない型:'numpy.ndarray'
-
[解決済み] Python IOError: ファイルが読み出し用に開かれていません
-
[解決済み] Kivy ScrollView内のGridLayoutをスクロールするにはどうすればよいですか?
-
[解決済み] Cythonコンパイルエラー:動的モジュールにモジュールエクスポート関数が定義されていない
-
[解決済み] 標準エラーストリームのロギングを無効にする方法は?
-
python IOError: イメージファイルを識別できない
-
TypeError: 'dict' オブジェクトは呼び出し可能ではありません。