python中什么时候使用列表,什么时候使用数组?

当列表不是首选时

很多同学在使用python数据类型时候,很多时候直接使用list,虽然列表既灵活又简单,但面对各类需求时,我们可能会有更好的选择。

比如,要存放1000万个浮点数的话,数组(array)的效率就要高得多,因为数组在背后存的并不是float对象,而是数字的机器翻译,也就是字节表述。这一点就跟C语言中的数组一样。再比如说,如果需要频繁对序列做先进先出的操作,deque(双端队列)的速度应该会更快。

如果在你的代码里,包含操作(比如检查一个元素是否出现在一个集合中)的频率很高,用set(集合)会更合适。set专为检查元素是否存在做过优化。但是他并不是序列,因为set是无序的。之后在具体就集合进行讲解。

哪些情况下可以替换列表的数据类型,让我们从数组开始。

数组

如果我们需要一个只包含数字的列表。那么array.array比list更高效。数组支持所有跟可变序列有关的操作,包括.pop,.inster和.extend。另外数组还提供从文件读取和存入文件的更快的方法。如.frombytes和.tofile

python数组和C语言数组一样精简。创建数组需要一个类型码,这个类型码用来表示在底层的C语言应该存放怎样的数据类型。比如b类型码代表的是有符号的字符(signedchar),因此array(‘b’)创建出的数组就只能存放一个字节大小的整数,范围从-128到127,这样的序列在很大的时候,我们能节省很多空间。而且python不会允许你在数组里存放指定类型之外的数据。

示例:创建一个有1000万个随机浮点数的数组开始,到如何把这个数组存放到文件里,再如何从文件中读取这个数组

from array import array  # 引入array类型
from random import random

floats = array("d", (random() for i in range(10 ** 7)))  # 2
# 利用一个可迭代对象来建立一个双精度浮点数组(类型码是"d")
# 这里我们用的可迭代对象是一个生成器表达式
print(floats[-1])  # >>> 0.5164130467607566
fp = open('/opt/pyweb/gjbfilesys/floats.bin', 'wb')
floats.tofile(fp)  # 把数组存入二进制文件中
fp.close()

floats2 = array('d')  # 新建一个双精度空数组
fp = open('/opt/pyweb/gjbfilesys/floats.bin', 'rb')
# 把1000万个浮点数从二进制文件中读取出来
floats2.fromfile(fp, 10 ** 7)
fp.close()
print(floats2[-1])  # >>> 0.5164130467607566 查看新数组的最后一个元素
if floats2 == floats:
    print(True)
# >>> True

这上面的代码我们能得出结论,array.tofile和array.fromfile用起来很简单。把这段代码跑一下,会发现速度也很快。一个小的经验告诉我,用array.fromfile从一个文件中二进制文件里读出1000万个双精度浮点数只需要0.1秒,这比文本文件里的读取速度要快60倍,因为后者会使用内置float方法把每一行文字转换为浮点数。另外使用array.tofile写入到二进制文件,比以每行一个浮点数的方式把所有的数字写到文本文件要快7倍。另外,1000万个这样的数在二进制文件中只占用80 000 000个字节(每个浮点数占用8个字节,不需要任何的额外空间)如果是文本的文件的话,我们需要181 515 739 个字节。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端工匠之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值