当前位置: 首页>编程语言>正文

python数组每个元素当成一个list 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 个字节。



https://www.xamrdz.com/lan/5g31963058.html

相关文章: