Python数据优化
在使用Jupyter NoteBook或者Jupyter Lab处理数据的过程中,我们可以使用python的各种方法来查看代码的 循行效率,如所用时间、内存占用等等。
一、测试运行时间
魔法命令%%time、%%timeit
在处理数据量级较大的数据中,特别是存在循环情况下,我们想知道大约多久能运行结束。这时我们可以使用这两个命令对代码进行测试。
%%time—测试当前cell中的代码运行一次所需的时间
%%time
list = []
for i in range(1000):
list.append(i)
输出:
Wall time: 997 µs
但是,只测试一次并不可靠,所以我们可以使用%%timeit,他会将该cell中的代码执行10000次,并给一个运行时间的平均值±标准差
%%timeit—测试当前cell中的代码所需的平均时间
%%timeit
list = []
for i in range(1000):
list.append(i)
输出:
121 µs ± 10.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
二、测试每一行代码所耗费时间
当我们知道了我们的一段代码运行完成所需要的时间并对其并不满意的情况下,我们就需要找到导致这一部分代码运行速度慢的“罪魁祸首”到底在哪一行,这时我们可以使用line_profiler模块来测试每一行代码所耗费的时间比。
模块安装:
>>> pip install line_profiler
引包:
%load_ext line_profiler
测试代码:
%load_ext line_profiler
def test():
a = 1
b = 2/5
c = (1+2)/5
%lprun -f test test()
输出:
Timer unit: 1e-07 s
Total time: 9.4e-06 s
File: <ipython-input-16-986077aa9db9>
Function: test at line 2
Line # Hits Time Per Hit % Time Line Contents
==============================================================
2 def test():
3 1 41.0 41.0 43.6 a = 1
4 1 29.0 29.0 30.9 b = 2/5
5 1 24.0 24.0 25.5 c = (1+2)/5
The line_profiler extension is already loaded. To reload it, use:
%reload_ext line_profiler
在输出中,Total time指代码运行总时间,Line指代码行数,Hits表示每行代码运行的次数,Time表示每行代码运行的总时间,Per Hits指每行代码运行一次的时间,% Time指每行代码运行时间的百分比。
这样我们就可以知道,到底时间主要耗费在哪行代码从而优化。
三、测试一个变量在内存中的所占大小
在运行过程中,由于我电脑太low,内存经常会出现不够用的情况。所以需要小心是否会出现MemoryError的情况。在Python中有两种方式可以查看变量所占内存。
- 原生Python 在 sys 模块中提供函数 getsizeof 来计算 Python 对象的大小
- 使用pympler模块中的asizeof计算Python对象的大小(推荐)
模块安装:
>>> pip install pympler
引包:
from pympler import asizeof
使用:
list = []
for i in range(1000):
list.append(i)
asizeof.asizeof(list)
输出:单位为字节,1kb=1024b
41016
当我们使用原生Python的 getsizeof 进行计算时:
from sys import getsizeof
a = []
for i in range(1000):
a.append(i)
getsizeof(a)
输出:
9024
个人认为asizeof更准确一下,至于为什么会出现差异,暂时还不理解。。。