05-Python 杂项

Python 相关

平常工作中用什么工具进行静态代码分析

点评:静态代码分析工具可以从代码中提炼出各种静态属性,这使得开发者可以对代码的复杂性、可维护性和可读性有更好的了解,这里所说的静态属性包括:

  1. 代码是否符合编码规范,例如:PEP-8。
  2. 代码中潜在的问题,包括:语法错误、缩进问题、导入缺失、变量覆盖等。
  3. 代码中的坏味道。
  4. 代码的复杂度。
  5. 代码的逻辑问题。

工作中静态代码分析主要用到的是 PylintFlake8

  • Pylint:可以检查出代码错误、坏味道、不规范的代码等问题,较新的版本中还提供了代码复杂度统计数据,可以生成检查报告。
  • Flake8:封装了Pyflakes(检查代码逻辑错误)、McCabe(检查代码复杂性)和 Pycodestyle(检查代码是否符合PEP-8规范)工具,它可以执行这三个工具提供的检查。
  • PyChecker:Python 代码分析工具
  • Pep8:静态检查 PEP8 编码风格的工具。

如何剖析 Python 代码的执行性能

剖析代码性能可以使用 Python 标准库中的 cProfilepstats 模块,cProfilerun 函数可以执行代码并收集统计信息,创建出 Stats 对象并打印简单的剖析报告。Statspstats 模块中的类,它是一个统计对象。

当然,也可以使用三方工具 line_profilermemory_profiler 来剖析每一行代码耗费的时间和内存,这两个三方工具都会用非常友好的方式输出剖析结构。

如果使用 PyCharm,可以利用“Run”菜单的“Profile”菜单项对代码进行性能分析,PyCharm 中可以用表格或者调用图(Call Graph)的方式来显示性能剖析的结果。

下面是使用 cProfile 剖析代码性能的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# example.py
import cProfile


def is_prime(num):
for factor in range(2, int(num ** 0.5) + 1):
if num % factor == 0:
return False
return True


class PrimeIter:

def __init__(self, total):
self.counter = 0
self.current = 1
self.total = total

def __iter__(self):
return self

def __next__(self):
if self.counter < self.total:
self.current += 1
while not is_prime(self.current):
self.current += 1
self.counter += 1
return self.current
raise StopIteration()


cProfile.run('list(PrimeIter(10000))')

如果使用line_profiler三方工具,可以直接剖析is_prime函数每行代码的性能,需要给is_prime函数添加一个profiler装饰器,代码如下所示。

1
2
3
4
5
6
@profiler
def is_prime(num):
for factor in range(2, int(num ** 0.5) + 1):
if num % factor == 0:
return False
return True

安装line_profiler

1
pip install line_profiler

使用line_profiler

1
kernprof -lv example.py

运行结果如下所示。

1
2
3
4
5
6
7
8
Line #    Hits    Time      Per Hit  % Time  Line Contents
==============================================================
1 @profile
2 def is_prime(num):
3 86624 48420.0 0.6 50.5 for factor in range(2, int(num ** 0.5) + 1):
4 85624 44000.0 0.5 45.9 if num % factor == 0:
5 6918 3080.0 0.4 3.2 return False
6 1000 430.0 0.4 0.4 return True

简述 vitualenv 及应用场景

vitualenv 是一个独立的 Python 虚拟环境。

当前项目依赖的是一个版本,但是另一个项目依赖的是另一个版本,这样就会造成依赖冲突,而 virtualenv 就是解决这种情况的,virtualenv 通过创建一个虚拟化的 Python 运行环境,将我们所需的依赖安装进去的,不同项目之间相互不干扰。

简述 pipreqs 及应用场景

pipreqs 可以通过对项目目录扫描,自动发现使用了那些类库,并且自动生成依赖清单。

1
pipreqs ./   # 生成 requirements.txt

supervisor 的作用

Supervisor:是一款基于 Python 的进程管理工具,可以很方便的管理服务器上部署的应用程序。是 C/S 模型的程序,其服务端是 supervisord 服务,客户端是 supervisorctl 命令

主要功能:

  1. 启动、重启、关闭包括但不限于 Python 进程。
  2. 查看进程的运行状态。
  3. 批量维护多个进程。

内存泄露场景 ★★★★★

  • 循环引用
  • 打开文件未正确关闭
  • 使用外部资源时没有显示释放
  • 一些机器学习、人工智能的库容易发生内存泄露
  • 使用装饰器也会造成内存泄露
  • 如果在Python中使用C扩展,需要确保在对应的资源不再需要时,手动释放资源。

开发相关

简述 jenkins 工具的作用

Jenkins:是一个可扩展的持续集成引擎。主要用于:

  • 持续、自动地构建/测试软件项目。
  • 监控一些定时执行的任务。

简述 saltstack、ansible、fabric、puppet 工具的作用?

待补充…


05-Python 杂项
https://flepeng.github.io/interview-20-开发语言类-21-Python-05-Python-杂项/
作者
Lepeng
发布于
2020年8月8日
许可协议