1. ホーム
  2. スクリプト・コラム
  3. パイソン

Pythonのパフォーマンスチューニングのための10のヒント まとめ

2022-01-26 18:02:32

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の過去の記事を検索するか、以下の記事を引き続きご覧ください。