Python代码优化之内存、运行时间

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更准确一下,至于为什么会出现差异,暂时还不理解。。。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值