>백엔드 개발 >파이썬 튜토리얼 >Python의 실행 효율성을 향상시키는 기술은 무엇입니까?

Python의 실행 효율성을 향상시키는 기술은 무엇입니까?

王林
王林앞으로
2023-05-11 14:13:061423검색

시작하기 전에 먼저 함수 실행 시간을 계산하는 Python 데코레이터를 개발할 수 있습니다. 이는 나중에 다양한 Python 기술을 사용한 후 시간 통계에 사용됩니다.

# 导入时间提取的time模块
from time import time

import dis


def compute_time(func_):
    '''
    计算函数的运行时间
    '''

    def func_time(*arg, **kw):
        t1 = time()
        result = func_(*arg, **kw)
        t2 = time()
        print(f"{func_.__name__: >10} : {t2 - t1:.6f} 秒")
        return result

    return func_time

위의 Compute_time 시간 계산 함수를 개발했는데, 정상적으로 사용되는지 테스트하기 위해 hello_world 함수를 개발할 수 있습니다.

@compute_time
def hello_world():
    print("hello_world!")


hello_world()

# hello_world!
# hello_world : 0.000000 秒

hello_world 함수 테스트를 통해 시간 데코레이터인 Compute_time이 함수의 실행 시간을 정상적으로 계산할 수 있음이 입증되었습니다.

다음으로 Python의 실행 속도를 향상하고 Time Running 결과를 제공하기 위한 다음 5가지 방법을 정식으로 소개하기 시작합니다.

1. 표준 또는 비표준 라이브러리의 합리적인 사용

개발 과정에서 Python의 표준 또는 비표준 라이브러리를 과소평가해서는 안 됩니다. 솔직히 말해서 우리가 때때로 작성하는 동일한 비즈니스 코드 블록은 큰 것만큼 완벽하지 않습니다. 얘들아.

예를 들어 다음 비즈니스에서는 Python 목록의 값을 문자열로 변환해야 합니다. 먼저 다음 코드 블록이 어떻게 작성되는지 살펴보세요.

# 初始化一个list列表
list_ = ['a', 'b', 'c'] * 10000


@compute_time
def func_1(list_=None):
    '''
    列表元素转字符串函数
    '''
    str_ = ''
    for s in list_:
        str_ = str_ + s
    return str_


func_1(list_)


# func_1 : 0.001999 秒

위의 func_1 함수 실행을 통해 직접 작성한 전통적인 방법을 사용하여 단계를 변환하는 것은 더 복잡하고 0.001999초가 걸립니다.

@compute_time
def func_2(list_=None):
    '''
    列表元素转字符串
    '''
    return ''.join(list_)


func_2(list_)

# func_2 : 0.000000 秒

func_1 함수의 실행 시간과 비교하면 func_2의 실행 시간은 거의 무시할 수 있으며, 십진수 6자리는 전혀 변화를 볼 수 없습니다.

2. 루프 사용 줄이기

실제로 우리는 일반적인 개발 과정에서 목록 파생, 반복 등을 사용하는 직렬화 가능한 데이터 처리 방법이 for 루프보다 더 편리하고 효율적이라는 것을 발견했습니다.

아래에서는 문제를 설명하기 위해 예를 사용할 수도 있습니다. 예를 들어 목록에서 2로 나눌 수 있는 숫자를 선택해야 합니다.

# 初始化循环次数n
n = 100000


@compute_time
def func_3(n=None):
    list_ = []
    for m in range(n):
        if m % 2 == 0:
            list_.append(m)
    return list_


@compute_time
def func_4(n=None):
    return [m for m in range(n) if m % 2 == 0]


func_3(n)

func_4(n)

# func_3 : 0.004986 秒
# func_4 : 0.003014 秒

func_3 함수와 func_4 함수의 비교를 통해 우선 func_4의 방법이 func_3보다 훨씬 간단합니다.

그리고 시간 측면에서 func_4는 목록 파생을 사용하여 일반 for 루프보다 1/4 더 빠르게 실행합니다.

3. 반복되는 코드 실행에 주의하세요

코드의 반복 실행에 관해서는 우리 모두 일반적인 개발 방법에서 경험할 수 있습니다. 즉, 공개 코드 블록으로 한 번 실행될 수 있습니다.

공개적으로 사용할 수 있는 코드 블록을 루프에 추가할 수 있으며, 이는 코드 블록의 실행 효율성에만 영향을 미칩니다.

예를 들어, 문자열의 특정 요소를 검색하려면 Python의 re 모듈을 사용해야 합니다. 다음은 시간 결과를 비교하는 두 가지 방법입니다.

# 导入正则表达式匹配模块
import re


@compute_time
def func_5(str_=None):
    for s in str_:
        result = re.search(r'a*[a-z]?c', s)


@compute_time
def func_6(str_=None):
    repx = re.compile(r'a*[a-z]?c')
    for s in str_:
        result = repx.search(s)


func_5('abcdefg1234oks' * 1000)

func_6('abcdefg1234oks' * 1000)

# func_5 : 0.006999 秒
# func_6 : 0.002000 秒

func_5와 func_6의 비즈니스 구현 방법을 비교해 보면, re 모듈의 컴파일 정규 매칭 객체를 for 루프의 외부 레이어에 직접 넣었고, 실행 시간이 3배 이상 직접적으로 단축되었습니다.

루프에서 직접 일반 객체를 일치시키기 위해 검색을 사용하면 루프에 일반 일치 객체가 지속적으로 생성되어 for 루프의 처리 부담이 증가하고 속도가 느려지기 때문입니다.

4. 전역 변수의 사용을 줄여보세요

이 점을 설명할 때 전역 변수는 항상 존재하며 프로그램 실행 중에 사라지지 않는다는 점을 이해해야 합니다.

전역 변수가 너무 많으면 작업 중에 너무 많은 메모리를 차지하므로 전역 변수에 비해 지역 변수를 사용하는 것이 더 효율적입니다.

아래에서는 두 가지 방법의 예를 사용하여 전역 변수와 지역 변수의 실행 시간을 비교합니다.

mes_1 = 'ss1'

mes_2 = 'ss2'

mes_3 = 'ss3'


@compute_time
def func_7():
    result = mes_1 + mes_2 + mes_3
    return result


@compute_time
def func_8():
    me_1 = 'ss1'
    me_2 = 'ss2'
    me_3 = 'ss3'
    result = me_1 + me_2 + me_3
    return result


func_7()

func_8()


# func_7 : 0.000997 秒
# func_8 : 0.000000 秒

문제를 설명하기 위해 위에서 일반적인 덧셈 계산을 수행했습니다. func_8 함수가 지역 변수를 사용하는 방식이 실제로 더 빠릅니다.

5. 합리적인 데이터 구조를 사용하세요

대부분의 Python 개발 프로세스에서 많은 사람들은 편의를 위해 데이터를 처리하기 위해 목록을 사용해야 합니다.

Python에는 목록, 튜플, 세트 및 사전의 네 가지 기본 제공 데이터 구조가 있습니다. 적절한 데이터 구조를 사용하여 적절한 비즈니스 시나리오에서 데이터를 처리하면 계산 실행 효율성도 향상될 수 있습니다.

예: 아래에서는 목록 목록과 튜플 튜플에서 해당 인덱스 위치의 값을 추출합니다.

@compute_time
def func_9():
    data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    print(data[3])


@compute_time
def func_10():
    data = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
    print(data[3])

func_9()

func_10()

# func_9 : 0.000000 秒
# func_10 : 0.000000 秒

func_9, func_10 함수를 실행해본 결과 둘 사이의 시간 차이는 크지 않고, 적어도 소수점 이하 6자리 이내에서는 결과를 구별할 수 없다는 사실을 발견했습니다.

print('func_9汇编产生的机器码:')
dis.dis(func_9)

print('func_10汇编产生的机器码:')
dis.dis(func_10)

마지막으로 func_9와 func_10의 어셈블리 기계 코드를 각각 살펴본 결과 분명히 목록 처리가 더 많은 기계 코드를 생성한다는 것을 발견했습니다.

아아아아

위 내용은 Python의 실행 효율성을 향상시키는 기술은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제