Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonコードの最適化のヒント?


Pythonは他の準拠言語ほど高速でも効率的でもないことは誰もが知っていますが、ただし、Pythonコードがはるかに大きなワークロードを処理できることを示している大企業はたくさんあり、それほど遅くはないことを示しています。このセクションでは、正しいPythonプログラムをさらに高速かつ効率的に実行するために、覚えておくべきヒントをいくつか紹介します。

ヒント1:組み込み関数を使用する

Pythonで効率的なコードを書くことはできますが、組み込み関数(Cで書かれている)に勝るものはありません。下の画像は、Python組み込み関数のリストを示しています

Pythonコードの最適化のヒント?

ヒント2:Pythonの複数の代入を使用して変数を交換する

>>> #Instead of using
>>> x, y = y, x
>>> #Use this - which is much faster
>>> temp = x
>>> x = y
>>> y = temp

ヒント3:グローバル変数を避け、可能であればローカル変数を使用する

Pythonは、グローバル変数を取得するよりもローカル変数を取得する方が高速です。つまり、可能であればグローバル変数を避けてください。

ヒント4:可能な限り「in」を使用する

メンバーシップ全般を確認するには、「in」キーワードを使用します。清潔で速いです。

for key in sequence:
   print ("Hello ", key)

ヒント5:無限ループには「while1」を使用します

プログラムで無限ループを実行しなければならない場合があります(たとえば、リスニングソケット)。 「whileTrue」は同じ操作を実行しますが、「while1」はシングルジャンプ操作です。

>>> while 1:
   # do something, faster with while 1
>>> while True:
   #do something, perform same operation but slower than then previous one

ヒント6:リスト内包表記を使用する

Python 2.0のリスト内包表記を使用して、多くの「for」ブロックと「while」ブロックを置き換えることができます。リスト内包表記は、Pythonインタープリターがループ中に予測可能なパターンを見つけるように最適化されているため、はるかに高速です。読みやすく、ほとんどの場合、カウント用に1つの余分な変数を節約できます。

たとえば、1行で1から25までの偶数を見つけるには:

>>> #Using list comprehension - good way
>>> print([i for i in range (25) if i%2 == 0])
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24]
>>> # Another way - not so efficient way
i = 0
evens = []

while i< 25:
   if i%2 == 0:
      evens.append(i)
   i += 1

print(evens)

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24]

ヒント7:Pythonジェネレーターを使用してオンデマンドで値を取得する

Pythonジェネレーターを使用すると、メモリが節約され、パフォーマンスが向上します。ビデオをストリーミングしている場合は、バイトのチャンクを送信できますが、ストリーム全体を送信することはできません。

>>> chunkBytes = (1000 * i for i in range(1000))
>>> next(chunkBytes)
0
>>> next(chunkBytes)
1000
>>> next(chunkBytes)
2000
>>> next(chunkBytes)
3000
>>>

ヒント8:itertoolsモジュールの使用

itertoolsモジュールは、反復と組み合わせに非常に便利で効率的です。

リスト[1、2、3、4、5]のすべての順列を数行のPythonコードで生成するには

>>> import itertools
>>> iter1 = itertools.permutations([1, 2, 3,4])
>>> list(iter1)
[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)]

ヒント9:リストをソートされた順序で保持するためのbisectモジュールの使用

これは、無料のバイナリ検索の実装であり、ソートされたシーケンスの高速挿入ツールです。

>>> import bisect
>>> bisect.insort(list, element)

要素をリストに挿入したので、コンテナを並べ替えたままにするためにsort()を再度呼び出す必要はありません。これは、長いシーケンスでは非常にコストがかかる可能性があります。

ヒント10:辞書を使用してメンバーシップをテストするように設定

ディクショナリとセットはハッシュテーブルを使用して実装されるため、要素がディクショナリまたはセットに存在するかどうかのチェックは、Pythonでは非常に高速です。ルックアップはO(1)と同じくらい速い場合があります。

>>> lst = ['a', 'ab', 'abc'] #Slow - Checking membership with list
>>> 'abc' in lst
True
>>> mySet = set(['a', 'ab', 'abc'])# Fast - checking membership with set or dictionary
>>> 'abc' in mySet
True

ヒント11:Pythonデコレータを使用して結果をキャッシュする

Pythonデコレータの記号は「@」です。トレース、ロック、ロギングだけでなく、Pythonデコレータを使用して、後で必要な結果(記憶)を記憶するようにPython関数を装飾することもできます。

>>> from functools import wraps
>>> def memo(f):
   cache = {}
   @wraps(f)
   def wrap(*arg):
      if arg not in cache:
         cache['arg'] = f(*arg)
      return cache['arg']
   return wrap

そして、このデコレータをフィボナッチ関数で使用できます

>>> @memo
def fib(i):
   if i<2:
      return 1
   return fib(i-1) + fib(i-2)

基本的な考え方は、計算した各フィボナッチ項を記憶するように関数を拡張(装飾)することです。キャッシュにある場合は、再度計算する必要はありません。


  1. WordPressの画像最適化のヒント

    画像はまともなウェブサイトの最も重要な要素の1つです。彼らは訪問者の注意を引き付け、コンテンツをより共有しやすくし、ユーザーに行動を起こさせます(製品の購入など)。 ただし、高解像度の画像やファイルサイズの大きい画像を追加すると、ウェブサイトの速度が低下し、エンドユーザーのユーザーエクスペリエンスが低下する可能性があります。品質を著しく損なうことなく画像を圧縮し、プロセスを自動化するのに役立つ多数のツールを使用して、ユーザーエクスペリエンスを低下させる言い訳はありません。 この記事では、Web、より具体的にはWordPressWebサイトで使用するために画像を最適化するさまざまな方法を紹介

  2. マーケティング担当者向けの App Store 最適化 (ASO) に関する 5 つのヒント

    スマホの進化に伴い、アプリビジネスは確実にブーム!アプリがなければ、スマートフォンは役に立たず、通常のデバイスのように機能します。しかし、ありがたいことに、アプリケーションが充実していれば、スマートフォンを使ってより多くのことができるようになり、日々のタスクを簡単にこなすことができます。フライトの予約からお気に入りのホテルの予約まで、すべてに対応するアプリがあります。 毎日、何百万ものアプリが App Store に追加されており、特にアプリ開発者にとって、競争は日に日に厳しくなっています。検索エンジンのしくみと同じように、画面に表示された最初のいくつかの検索結果にほとんどスクロールせずにヒ