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

您所在的位置:网站首页 怎么缩短程序运行时间的方法 Python代码优化之内存、运行时间

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

2024-07-10 01:15| 来源: 网络整理| 查看: 265

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3