Python はどのようにコードを最適化して高速化する必要がありますか?

元のリンク: python スピードアップ スキル

職場では、コードの高速化の最適化の問題に直面することがよくあります.この記事では、いくつかのPython一般的な高速化手法を紹介します.

最適化の原則:
1. 最初にコードが正しく実行できることを確認してから、パフォーマンスの最適化を実行します.
2. 最適化の選択は、通常、時間のためにスペースを犠牲にすることであるため、コストを比較検討する必要があります.
3. 時間の最適化に焦点を当てる-コードの一部を消費し、全体的な最適化は通常、コードの可読性を低下させます

0 時間のかかるデコレータを定義する

# 可监控程序运行时间
import time
def clock(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("共耗时: %s秒" % round(end_time - start_time, 2))
        return result
    return wrapper

1 グローバル変数の使用を避ける

start_time = time.time()
size = 10000
for x in range(size):
    for y in range(size):
        z = x * y
end_time = time.time()
print('共耗时:%s秒' % round(end_time - start_time, 2))

# 共耗时:11.78秒,不推荐
# 使用局部变量
@clock
def multiplication():
    size = 10000
    for x in range(size):
        for y in range(size):
            z = x * y
multiplication()

# 共耗时: 5.5秒,提速50%

2 メソッド(関数)のプロパティへのアクセスを避け、from X import X を利用してみる

import math
@clock
def computeSqrt():
    result = []
    for i in range(10000000):
        # math方法访问sqrt属性
        result.append(math.sqrt(i))
computeSqrt()

# 不推荐,共耗时: 2.09秒
# 使用from X import X,直接访问sqrt
from math import sqrt
@clock
def computeSqrt():
    result = []
    for i in range(10000000):
        result.append(sqrt(i))
computeSqrt()

# 推荐,共耗时: 1.75秒

[1] で、ローカル変数のルックアップはグローバル変数よりも高速になると述べたので、頻繁にアクセスされる変数についてはappend、ローカル変数に変更すると処理が高速化されます。

from math import sqrt
@clock
def computeSqrt():
    result = []
    # 赋值给局部变量
    append = result.append
    for i in range(10000000):
        append(sqrt(i))
computeSqrt()

# 推荐,共耗时: 1.45秒

3 トラバーサルの最適化

# 使用while进行遍历
@clock
def circulate():
    i = 0
    li = []
    append = li.append
    while i < 10000000:
        append(i*2)
        i += 1
    return li
circulate()

# 不推荐,共耗时:1.48秒
@clock
def circulate():
    li = []
    append = li.append
    # 使用for代替while
    for i in range(10000000):
        append(i*2)
    return li
circulate()

# for优于while,共耗时:1.09秒
@clock
def circulate():
    # 使用列表推导式
    return [i*2 for i in range(10000000)]
circulate()

# 推荐列表推导式,共耗时:0.88秒。但不适用于复杂计算。

4 内部 for ループの計算を減らす

from math import sqrt
@clock
def inner():
    size = 10000
    for x in range(size):
        for y in range(size):
            # 相当于在重复计算sqrt(x)
            z = sqrt(x) + sqrt(y)
inner() 

# 不推荐,共耗时:19.00秒
from  math import sqrt
@clock
def inner():
    size = 10000
    for x in range(size):
        # 只计算一次sqrt(x),然后将它存了起来
        sqrt_x = sqrt(x)
        for y in range(size):
            z = sqrt_x + sqrt(y)
inner() 

# 推荐,共耗时:10.22秒

5Numpyデータ型を使った操作

Numpy最下層はC语言実装されており、このスクリプト言語はこのコンパイル済み言語Pythonと比較しC/C++て効率とパフォーマンスの点で当然不利であるため、Numpy計算を実行する前にデータの型変換を実行するパッケージを導入できます。

import numpy as np

li = [i for i in range(10000000)]

@clock
def npSpeed():
    # 使用Python方法
    sum(li)
npSpeed() 

# 共耗时0.79秒
import numpy as np

li = np.array([i for i in range(100000000)])
@clock
def npSpeed():
    # 使用Numpy方法
    np.sum(li)
npSpeed() 

# 共耗时0.11秒,速度约是Python的8倍

Numpyデータ量が多いほどメリットが顕著になります。そのため、機械学習や深層学習のプロジェクト タスクでNumpy非常に頻繁に使用されます。

元のリンク: python スピードアップ スキル

AI 深層学習関連のその他の乾物は、公式アカウントで入手できます: AI には温度があります
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Antai_ZHU/article/details/121117437