Topic 12.5 - 常用的第三方模块与包(补充)¶
在 Python 的生态系统中,除了内置模块和包之外,还有大量的第三方模块和包可供使用
- 这些第三方模块和包由全世界的开发者创建和维护,并且自愿开源分享
- 目前流行的 Python 第三方模块涵盖各种功能和应用场景,丰富了 Python 的使用体验
本章我们来介绍一些常用的第三方模块和包,涉及到数据分析的包:如 numpy、pandas、matplotlib 等,我们会在后续的数据分析模块中进行详细介绍,这里先不多说。
1. 第三方包的安装与使用¶
(1) 安装第三方包¶
Python 内置模块和包,与第三方模块和包,最大的区别在于,第三方模块和包需要通过包管理工具(如 pip)进行安装,之后才能在代码中使用。
安装第三方包的命令需要在终端中运行,不是 Python 中运行:
-
安装一个包的终端命令格式为:
pip install package_name -
安装多个包的终端命令格式为:
pip install package_name1 package_name2 package_name3 -
例如,我们安装这一节要介绍的几个包:
pip install joblib tqdm
安装完成后,就可以在代码中使用 import 语句导入这些包了:
import joblib
import tqdm
- 安装的命令只需要运行一次,安装完成后就可以在任何 Python 代码中使用这些包了
- 如果没有安装,或者安装失败,在运行
import代码时会报错ModuleNotFoundError
终端命令的运行有多种方式:
- 最直接的就是在 VS Code 中新建一个终端窗口
-
其实在 Jupyter Notebook 中也可以运行终端命令,只需要在命令前加上
!符号即可,这是 Jupyter Notebook 的魔法命令,例如:!pip install package_name -
注意,这种方式只能在
.ipynb文件中使用,在.py文件中不能使用
(2) 升级第三方包¶
第三方包由开发者们持续维护和更新,可能会发布新版本以修复 bug 或添加新功能。
-
升级一个包的终端命令格式为:
pip install --upgrade package_name -
升级多个包的终端命令格式为:
pip install --upgrade package_name1 package_name2 package_name3 -
例如,我们升级刚才安装的几个包:
pip install --upgrade joblib tqdm
(3) 卸载第三方包¶
如果不再需要某个第三方包,可以通过卸载命令将其移除。
-
卸载一个包的终端命令格式为:
pip uninstall package_name -
卸载多个包的终端命令格式为:
pip uninstall package_name1 package_name2 package_name3
但是,由于 Python 卸载后如果需要再次使用还需要重新安装,所以一般不建议频繁卸载包。
2. joblib 模块¶
joblib 模块主要用于高效地进行大规模数据运算,最常用的功能就是并行计算了。
(1) Python 程序的单线程执行¶
我们目前为止接触到的 Python 代码,都是在单线程下顺序运行的:
比方说我们有以下列表,我们想将列表中的每个数字都进行平方计算,然后将平方后的数字求和:
data = range(1, 101)
def compute_square(x):
return x * x
data_squared = []
for num in data:
result = compute_square(num)
data_squared.append(result)
total = sum(data_squared)
print("平方和:", total)
平方和: 338350
在上面的代码中,我们计算平方的过程是顺序执行的:
-
先计算
1的平方,然后计算2的平方,依次类推,直到计算完所有数字的平方 -
但是,我们仔细分析发现,计算每个数字的平方其实是相互独立的操作,计算
1的平方并不依赖于计算2的平方 -
因此,如果能够同时计算多个数字的平方,就能大大提升计算效率
(2) 使用 joblib 实现并行计算¶
joblib 模块提供了非常方便的并行计算功能,我们可以利用它来同时计算多个数字的平方:
from joblib import Parallel, delayed
data = range(1, 101)
def compute_square(x):
return x * x
data_squared = Parallel(n_jobs=-1)(delayed(compute_square)(num) for num in data)
total = sum(data_squared)
print("平方和:", total)
平方和: 338350
在上面的代码中,
Parallel()函数用于创建一个并行计算的环境n_jobs指定可用的 CPU 核心数,指定为-1表示使用所有可用的核心delayed()函数用于将需要并行执行的函数进行包装,使其可以被Parallel()调用
通过这种方式,joblib 会自动将计算任务分配到多个 CPU 核心上同时执行,从而大大提升计算效率
3. tqdm 模块¶
tqdm 模块用于在 Python 程序中显示进度条,特别适合用于长时间运行的循环或任务,让用户可以直观地看到任务的进展情况
(1) 在循环中使用 tqdm¶
tqdm 在执行循环时,须要将可迭代对象(如 range())包裹在 tqdm 函数中,这样就能在循环开始时显示一个进度条。
我们可以很方便地在循环中使用 tqdm 来显示进度条:
from tqdm import tqdm
import time
for i in tqdm(range(100)):
# 模拟一些耗时操作
time.sleep(0.1)
100%|██████████| 100/100 [00:10<00:00, 9.47it/s]
在上面的代码中:
tqdm(range(100))会在循环开始时显示一个进度条- 随着循环的进行,进度条会动态更新,显示当前的进度百分比、已用时间和预计剩余时间
(2) 在 joblib 并行计算中使用 tqdm¶
tqdm 还可以与 joblib 结合使用,在并行计算时显示进度条,只需将 tqdm 包裹在可迭代对象外层即可:
例如,我们将前面的并行计算平方和的例子,加入进度条显示:
from joblib import Parallel, delayed
from tqdm import tqdm
import time
data = range(1, 101)
def compute_square(x):
time.sleep(0.1) # 模拟耗时操作
return x * x
data_squared = Parallel(n_jobs=-1)(delayed(compute_square)(num) for num in tqdm(data))
total = sum(data_squared)
print("平方和:", total)
100%|██████████| 100/100 [00:01<00:00, 96.54it/s]
平方和: 338350