0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python怎样存储变量性能最优

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 15:33 次阅读

工作时我们经常会遇到需要临时保存结果变量的场景,尤其是一些数据处理、模型开发的场景,加载处理速度是个很漫长的过程,于是经常会把这些变量储存起来。

而储存变量最常见、最普遍的方法是用pickle,保存为pkl文件。但是如果从写入和读取的性能角度考虑,pkl可能真的不是最优选。

Pickle有其独特的好处,大部分变量不需要进行处理,都能直接存到pkl文件里,但这样的方便其实是牺牲了部分性能取得的。与之相比,numpy的.npy格式就比pickle性能上快不少。

当然,我们需要有证据支撑这个观点。所以今天我们就来做个实验,分别在Python2和Python3中对比 numpy 和 pickle 两种存储格式(.npy, .pkl) 对数据的存储和读取的性能对比。

部分内容参考分析自: https://applenob.github.io/python/save/

1. Python2中, npy与pkl的性能对比

首先初始化数据:

import numpy as np
import time
import cPickle as pkl
import os

all_batches = []
for i in range(20):
    a1 = np.random.normal(size=[25600, 40])
    label = np.random.normal(size=[25600, 1])
    all_batch = np.concatenate([a1, label], 1)
    all_batches.append(all_batch)
all_batches = np.array(all_batches)
print(all_batches.shape)
# (20, 25600, 41)

然后测试使用pickle保存和读取时间的耗时,以及整个文件的大小:

s_t1 = time.time()
pkl_name = "a.pkl"
with open(pkl_name, "wb") as f:
    pkl.dump(all_batches, f)
pkl_in_time = time.time() - s_t1
print("pkl dump costs {} sec".format(pkl_in_time))

s_t2 = time.time()
with open(pkl_name, "rb") as f:
    new_a = pkl.load(f)
pkl_out_time = time.time() - s_t2
print("pkl load costs {} sec".format(pkl_out_time))

pkl_size = os.path.getsize(pkl_name)
print("pkl file size: {} byte, {} mb".format(pkl_size, float(pkl_size)/(1024*1024)))

结果如下:

图片

即:

pkl dump costs 67.7483091354 sec
pkl load costs 52.1168899536 sec
pkl file size: 497437110 byte, 474.392995834 mb

然后再试一下npy的写入和读取:

s_t3 = time.time()
npy_name = "a.npy"
with open(npy_name, "wb") as f:
    np.save(f, arr=all_batches)
npy_in_time = time.time() - s_t3
print("npy save costs {} sec".format(npy_in_time))
s_t4 = time.time()
with open(npy_name, "rb") as f:
    new_a = np.load(f)
npy_out_time = time.time() - s_t4
print("npy load costs {} sec".format(npy_out_time))
npy_size = os.path.getsize(npy_name)
print("npy file size: {} byte, {} mb".format(npy_size, float(npy_size) / (1024 * 1024)))

结果如下:

图片

即:

npy save costs 20.718367815 sec
npy load costs 0.62314915657 sec
npy file size: 167936128 byte, 160.15637207 mb

结果发现,npy性能明显优于pkl格式。

通过多次测试发现,在Python2中,npy格式的性能优势全面碾压pkl,工程允许的情况下,在Python2中,我们应该在这二者中毫不犹豫地选择npy.

2.Python3中, npy与pkl的性能对比

Python2已经是过去式,重点还要看Python3.

在Python3中,与Python2的代码唯一一句不一样的是pickle的引入:

# Python2:
import cPickle as pkl

# Python3:
import pickle as pkl

其他代码基本一样,替换代码后,重新运行程序,让我们看看在Python3上,npy格式和pkl格式性能上的区别,首先是pkl格式的表现:

ckenddeMacBook-Pro:Documents ckend$ python 1.py
(20, 25600, 41)
pkl dump costs 24.32167887687683 sec
pkl load costs 4.480823040008545 sec
pkl file size: 167936163 byte, 160.15640544891357 mb

然后是npy格式的表现:

npy save costs 22.471696853637695 sec
npy load costs 0.3791017532348633 sec
npy file size: 167936080 byte, 160.1563262939453 mb

可以看到在Python3中pkl格式和npy格式的存储大小是基本相同的,在存储耗时上也相差无几。但是在读取数据的时候,npy相对于pkl还是有一定的优势的。

因此,如果你的程序非常注重读取效率,那么我觉得npy格式会比pkl格式更适合你。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 文件
    +关注

    关注

    1

    文章

    561

    浏览量

    24695
  • 数据处理
    +关注

    关注

    0

    文章

    581

    浏览量

    28527
  • 模型
    +关注

    关注

    1

    文章

    3171

    浏览量

    48711
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84449
收藏 人收藏

    评论

    相关推荐

    python环境变量的配置pip

    开始,然后讨论如何找到Python的安装路径以及如何配置环境变量。接下来,我们将详细讲解pip的用途和安装方法,并解决一些与pip相关的常见问题。 一、环境变量的概念 环境变量是操作系
    的头像 发表于 12-15 15:41 2353次阅读

    怎样才能使本本达到最优性能

    怎样才能使本本达到最优性能 问题:我是一个最近购本的菜鸟,请问怎样才能使本本达到最优性能? 回
    发表于 01-25 14:39 517次阅读

    python环境变量设置

    安装python之后,我们往往面临这样一个问题,在命令行输入“python”,竟然出错,难道是没有安装成功吗?非也,其实是你的系统环境变量没有设置好。今天,小编就来带大家学学python
    发表于 11-20 11:47 2352次阅读
    <b class='flag-5'>python</b>环境<b class='flag-5'>变量</b>设置

    Python的常量与变量基础知识详解

    Python是一门强类型的动态语言。 字面常量,变量没有类型,变量只是在特定的时间指向特定的对象而已,变量所指向的对象是有类型的。 变量
    发表于 12-14 05:31 1809次阅读

    python性能之服务优化的方法解析

    怎样发挥Python语言的最高性能
    的头像 发表于 12-31 01:04 3574次阅读
    <b class='flag-5'>python</b><b class='flag-5'>性能</b>之服务优化的方法解析

    python设置环境变量

    我们想要运行python,需要安装Python,还要设置一些环境变量1,此电脑,右键属性2、高级系统设置-> 环境变量3、在系统变量中找到p
    发表于 11-10 14:49 876次阅读

    Python私有变量的定义方法

    学过编程语言的人员,都知道私有变量在编程中必不可少,与Java和C语言用private关键字定义私有变量不同,Python是在变量前面加上双横杠(例如:__test)来标识,
    发表于 02-13 16:49 1648次阅读

    Python变量类型详细资料说明

    Python 中的变量赋值不需要类型声明。每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。每个变量在使用前都必须赋值,
    发表于 08-24 16:47 3次下载
    <b class='flag-5'>Python</b>的<b class='flag-5'>变量</b>类型详细资料说明

    深入了解python常量与变量

      Python变量和常量不需要事先声明类型,这是根据Python的动态语言特性而来。
    的头像 发表于 02-16 18:22 1890次阅读
    深入了解<b class='flag-5'>python</b>常量与<b class='flag-5'>变量</b>

    python变量的作用域

    python变量的作用域 1. 作用域 Python的作用域可以分为四种: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Global) 全局作用域 B
    的头像 发表于 03-03 16:50 1546次阅读

    Python-无处不在的变量

    Python中,每个变量在使用前都必须赋值,变量赋值以后,该变量才会被创建
    的头像 发表于 02-16 14:51 557次阅读

    浅析python变量类型

    python不需要事先声明变量python变量类型是在运行过程中自动决定的,不需要代码声明类型。
    的头像 发表于 03-10 10:11 777次阅读
    浅析<b class='flag-5'>python</b>的<b class='flag-5'>变量</b>类型

    如何配置Python环境变量

    配置Python环境变量是在安装Python解释器后的一项重要步骤,它允许您在任何位置都可以通过命令行或脚本运行Python解释器,使Python
    的头像 发表于 04-14 12:16 2w次阅读

    Python怎样存储变量性能最优

    ,保存为pkl文件。但是如果从写入和读取的性能角度考虑,pkl可能真的不是最优选。 Pickle有其独特的好处,大部分变量不需要进行处理,都能直接存到pkl文件里,但这样的方便其实是牺牲了部分
    的头像 发表于 10-17 11:34 357次阅读
    <b class='flag-5'>Python</b><b class='flag-5'>怎样</b><b class='flag-5'>存储</b><b class='flag-5'>变量</b><b class='flag-5'>性能</b><b class='flag-5'>最优</b>

    python变量命名规则

    Python是一种高级编程语言,广泛应用于软件开发、数据分析和科学计算等领域。在Python中,变量是用来存储数据的容器,它们具有名称以及与之关联的值。然而,
    的头像 发表于 11-23 15:44 1217次阅读