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秒

5 Numpy데이터 유형을 사용한 연산

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