이 기사의 내용은 Python 스크립트(코드 예제)의 디버깅 및 분석에 관한 것입니다. 필요한 친구가 참고할 수 있기를 바랍니다.
디버깅과 프로파일링은 Python 개발에서 중요한 역할을 합니다. 디버거는 프로그래머가 전체 코드를 분석하는 데 도움이 됩니다. 디버거는 중단점을 설정하고, 프로파일러는 코드를 실행하고 실행 시간 세부 정보를 제공하며, 프로파일러는 프로그램의 병목 현상을 식별합니다.
디버깅은 코드에서 발생하는 문제를 해결하고 소프트웨어가 제대로 작동하지 못하게 하는 프로세스입니다. Python에서는 디버깅이 매우 쉽습니다. Python 디버거는 조건부 중단점을 설정하고 소스 코드를 한 번에 한 줄씩 디버그합니다. Python 표준 라이브러리의 pdb 모듈을 사용하여 Python 스크립트를 디버깅합니다.
Python 프로그램을 더 효과적으로 디버깅하기 위해 다양한 기술을 사용할 수 있습니다. 우리는 Python 디버깅을 위한 네 가지 기술을 논의할 것입니다:
이 섹션에서는 Python이 예외를 처리하는 방법을 알아봅니다. 예외는 프로그램 실행 중에 발생하는 오류입니다. 오류가 발생할 때마다 Python은 예외를 생성하며, 이는 try...out 블록을 사용하여 처리됩니다. 프로그램이 특정 예외를 처리할 수 없어 오류 메시지가 발생합니다. 이제 우리는 몇 가지 특이한 예를 볼 것입니다.
터미널에서 python3 대화형 콘솔을 시작하면 몇 가지 예외 예가 표시됩니다.
student@ubuntu:~$ python3 Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> >>> 50 / 0 Traceback (most recent call last): File "", line 1, in ZeropisionError: pision by zero >>> >>> 6 + abc*5 Traceback (most recent call last): File "", line 1, in NameError: name 'abc' is not defined >>> >>> 'abc' + 2 Traceback (most recent call last): File "", line 1, in TypeError: Can't convert 'int' object to str implicitly >>> >>> import abcd Traceback (most recent call last): File "", line 1, in ImportError: No module named 'abcd' >>>
다음은 몇 가지 예외 예입니다. 이제 예외를 어떻게 처리하는지 살펴보겠습니다.
Python 프로그램에서 오류가 발생할 때마다 예외가 발생합니다. 또한 raise 키워드를 사용하여 예외를 강제로 발생시킬 수도 있습니다.
이제 예외를 처리하는 try...out 블록을 볼 수 있습니다. try 블록에서는 예외를 생성할 수 있는 코드를 작성합니다. Except 블록에는 예외에 대한 솔루션을 작성합니다.
try...Exception 구문은 다음과 같습니다.
try: statement(s) except: statement(s)
try 블록에는 여러 개의 Except 문이 있을 수 있습니다. Except 키워드 뒤에 예외 이름을 입력하여 특정 예외를 처리할 수도 있습니다. 특정 예외를 처리하는 구문은 다음과 같습니다:
try: statement(s) except exception_name: statement(s)
ZeropisionError를 잡기 위해 예외_example.py 스크립트를 생성합니다. 스크립트에 다음 코드를 작성하세요:
a = 35 b = 57 try: c = a + b print("The value of c is: ", c) d = b / 0 print("The value of d is: ", d) except: print("pision by zero is not possible") print("Out of try...except block")
아래와 같이 스크립트를 실행하면 다음과 같은 출력이 표시됩니다.
student@ubuntu:~$ python3 exception_example.py The value of c is: 92 pision by zero is not possible Out of try...except block
이제 pdb 디버거 사용법을 배워보겠습니다. 이 디버거를 사용하는 방법에는 세 가지가 있습니다:
· 인터프리터에서
· 명령줄에서
· Python 스크립트에서 #🎜🎜 #
pdb_example.py 스크립트를 생성하고 스크립트에 다음 내용을 추가합니다:class Student: def __init__(self, std): self.count = std def print_std(self): for i in range(self.count): print(i) return if __name__ == '__main__': Student(5).print_std()
인터프리터에서
$ python3
student@ubuntu:~$ python3 Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> >>> import pdb_example >>> import pdb >>> pdb.run('pdb_example.Student(5).print_std()') > (1)() (Pdb)
student@ubuntu:~$ python3 Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> >>> import pdb_example >>> import pdb >>> pdb.run('pdb_example.Student(5).print_std()') > (1)() (Pdb) continue 0 1 2 3 4 >>>
명령줄에서 디버깅 실행
$ python3 -m pdb pdb_example.py
student@ubuntu:~$ python3 -m pdb pdb_example.py > /home/student/pdb_example.py(1)() -> class Student: (Pdb) continue 0 1 2 3 4 The program finished and will be restarted > /home/student/pdb_example.py(1)() -> class Student: (Pdb)
import pdb class Student: def __init__(self, std): self.count = std def print_std(self): for i in range(self.count): pdb.set_trace() print(i) return if __name__ == '__main__': Student(5).print_std()
现在,按如下方式运行程序:
student@ubuntu:~$ python3 pdb_example.py > /home/student/pdb_example.py(10)print_std() -> print(i) (Pdb) continue 0 > /home/student/pdb_example.py(9)print_std() -> pdb.set_trace() (Pdb)
set_trace() 是一个Python函数,因此您可以在程序中的任何位置调用它。
因此,这些是启动调试器的三种方式。
在本节中,我们将看到跟踪模块。跟踪模块有助于跟踪程序执行。因此,每当您的Python程序崩溃时,我们都可以理解崩溃的位置。我们可以通过将跟踪模块导入您的脚本以及命令行来使用它。
现在,我们将创建一个名为脚本trace_example.py并在脚本中编写以下内容:
class Student: def __init__(self, std): self.count = std def go(self): for i in range(self.count): print(i) return if __name__ == '__main__': Student(5).go()
输出如下:
student@ubuntu:~$ python3 -m trace --trace trace_example.py --- modulename: trace_example, funcname: trace_example.py(1): class Student: --- modulename: trace_example, funcname: Student trace_example.py(1): class Student: trace_example.py(2): def __init__(self, std): trace_example.py(5): def go(self): trace_example.py(10): if __name__ == '__main__': trace_example.py(11): Student(5).go() --- modulename: trace_example, funcname: init trace_example.py(3): self.count = std --- modulename: trace_example, funcname: go trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 0 trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 1 trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 2 trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 3 trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 4
因此,通过trace --trace在命令行使用,开发人员可以逐行跟踪程序。因此,只要程序崩溃,开发人员就会知道崩溃的实例。
分析Python程序意味着测量程序的执行时间。它衡量每个功能所花费的时间。Python的cProfile模块用于分析Python程序。
如前所述,分析意味着测量程序的执行时间。我们将使用cProfile Python模块来分析程序。
现在,我们将编写一个 cprof_example.py 脚本并在其中编写以下代码:
mul_value = 0 def mul_numbers( num1, num2 ): mul_value = num1 * num2; print ("Local Value: ", mul_value) return mul_value mul_numbers( 58, 77 ) print ("Global Value: ", mul_value)
运行程序,您将看到如下输出:
student@ubuntu:~$ python3 -m cProfile cprof_example.py Local Value: 4466 Global Value: 0 6 function calls in 0.000 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 cprof_example.py:1() 1 0.000 0.000 0.000 0.000 cprof_example.py:2(mul_numbers) 1 0.000 0.000 0.000 0.000 {built-in method builtins.exec} 2 0.000 0.000 0.000 0.000 {built-in method builtins.print} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
因此,使用时cProfile,所有被调用的函数都将打印出每个函数所花费的时间。现在,我们将看到这些列标题的含义:
· ncalls: 通话次数
· tottime: 在给定函数中花费的总时间
· percall:商数tottime除以ncalls
· cumtime:在此和所有方面花费的累计时间 subfunctions
· percall:cumtime除以原始调用的商数
· filename:lineno(function):提供每个功能的相应数据
timeit是一个Python模块,用于计算Python脚本的一小部分。您可以从命令行调用timeit,也可以将timeit模块导入到脚本中。我们将编写一个脚本来计算一段代码。创建一个timeit_example.py脚本并将以下内容写入其中:
import timeit prg_setup = "from math import sqrt" prg_code = ''' def timeit_example(): list1 = [] for x in range(50): list1.append(sqrt(x)) ''' # timeit statement print(timeit.timeit(setup = prg_setup, stmt = prg_code, number = 10000))
使用timeit,我们可以决定我们要测量的代码片段。因此,我们可以轻松定义设置代码以及我们要单独执行测试的代码段。主代码运行100万次,这是默认时间,而设置代码只运行一次。
有多种方法可以使Python程序运行得更快,例如:
위 내용은 Python 스크립트 디버깅 및 분석(코드 예제)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!