python 腌菜和货架有什么区别?

c2e8gylq  于 2023-02-07  发布在  Python
关注(0)|答案(3)|浏览(136)

这是我第一次学习对象序列化。我试着阅读和“google”模块pickle和shelve的不同之处,但我不确定我是否理解。何时使用哪一个?Pickle可以将每个python对象转换成字节流,并可以持久化到一个文件中。那么我们为什么需要模块shelve?pickle不是更快吗?

w46czmvw

w46czmvw1#

pickle用于将一些对象(或多个对象)序列化为文件中的单个字节流。
shelve构建在pickle之上,并实现了一个序列化字典,其中对象被pickle,但与一个键(某个字符串)相关联,因此您可以加载搁置的数据文件并通过键访问pickle对象。
下面是两者之间的用法示例(应该可以在Python 2.7和Python 3.x的最新版本中使用)。

示例

import pickle

integers = [1, 2, 3, 4, 5]

with open('pickle-example.p', 'wb') as pfile:
    pickle.dump(integers, pfile)

这会将integers列表转储到名为pickle-example.p的二进制文件中。
现在试着阅读回pickle文件。

import pickle

with open('pickle-example.p', 'rb') as pfile:
    integers = pickle.load(pfile)
    print integers

上面的输出应该是[1, 2, 3, 4, 5]

示例

import shelve

integers = [1, 2, 3, 4, 5]

# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'c')) as shelf:
with shelve.open('shelf-example', 'c') as shelf:
    shelf['ints'] = integers

注意如何通过类似字典的访问将对象添加到工具架。
使用如下代码将对象读回:

import shelve

# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'r')) as shelf:
with shelve.open('shelf-example', 'r') as shelf:
    for key in shelf.keys():
        print(repr(key), repr(shelf[key]))

输出将为'ints', [1, 2, 3, 4, 5]

piztneat

piztneat2#

根据pickle文件:
序列化是比持久化更原始的概念;尽管pickle读取和写入文件对象,但是它不处理命名持久对象的问题,也不是(甚至更复杂)并发访问持久对象的问题。pickle模块可以将复杂对象转换为字节流,也可以将字节流转换为具有相同内部结构的对象。处理这些字节流最明显的方法可能是将它们写入文件,但也可以通过网络发送它们或将它们存储在数据库中。shelve模块提供了一个简单的接口,用于在DBMS样式的数据库文件上pickle和unpickle对象。

dgenwo3n

dgenwo3n3#

优点和缺点

因为没人真的提过

DBM:

      • 赞成意见**:

1.简单易用:DBM是一个基本的键值存储,需要最少的设置。DBM提供了对数据的快速访问,尤其是与其他基于磁盘的存储选项相比。
1.可处理大量数据:DBM能够处理非常大的数据集,前提是您有足够的磁盘空间。

      • 缺点**:

1.功能有限:DBM是一个简单的键-值存储,不提供高级功能,如事务或多进程并发。
1.不太适合复杂的数据结构:DBM最适合存储简单的键-值对,对于需要每个键多个值或更高级查询功能的复杂数据结构,可能不是最佳选择。

货架:

      • 赞成意见**:

1.丰富的功能:Shelve为数据访问提供了更丰富的API,包括每个键存储多个值的能力、对事务的支持以及更高级的查询功能。
1.易于使用:Shelve是比DBM更友好的API,因为它为数据存储和检索提供了一个类似字典的接口。

      • 缺点**:

慢于DBM:
1.与DBM相比,Shelve的开销更高,可能不适合大型数据集或具有高性能要求的应用程序。
1.可能无法很好地缩放:Shelve可能无法处理非常大的数据集或高并发级别,因为它更容易出现锁定和其他性能问题。

相关问题