代码及内容源自《Fluent Python》——Luciano Ramalho 著
对于单纯的数值,array.array会比列表更高效。它不仅支持可变序列的所有操作(包括:.pop, .insert, .extend),也支持用于快速载入和保存的其他方法,如.frombytes和.tofile。创建array时,需要提供类型代号,并且Python不允许在array中放入任何与其类型不符的值。
>>> from array import array
>>> from random import random
>>> floats = array('d', (random() for i in range(10**7)))
>>> fp=open('floats.bin','wb')
>>> floats.tofile(fp)
>>> fp.close()
>>> floats2 = array('d')
>>> fp=open('floats.bin','rb')
>>> floats2.fromfile(fp,10**7)
>>> fp.close()
>>> floats2 == floats
True
>>> floats[-1]
0.9896395989961131
>>> floats2[-1]
0.9896395989961131
从这段代码可以看出,array.tofile和array.fromfile使用起来很方便。并且,如果你尝试运行一下这个例子(生成、保存、载入一千万个随机浮点数),就会发现它运行的非常快。实验表明,利用array.fromfile从二进制文件(由array.tofile创建)中载入一千万个双精度浮点数需要约0.1s,这几乎是从文本文件中读取相同数据量的速度的60倍。利用array.tofile保存的速度大约是向文本文件中每行写入一个浮点数的速度的7倍。
memoryview类是一个共享内存序列,可以使你在处理arrays时不需要复制字节。
>>> from array import array
>>> numbers = array('h',[-2,-1,0,1,2])
>>> memv = memoryview(numbers)
>>> len(memv)
5
>>> memv[0]
-2
>>> memv_oct = memv.cast('B')
>>> memv_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
>>> memv_oct[5]=4
>>> numbers
array('h', [-2, -1, 1024, 1, 2])
当然,如果你需要利用array来处理更高级的数值运算,那么应当使用NumPy和SciPy。事实上,对于高级数组和矩阵运算而言,NumPy和SciPy正是Python能够成为科学计算领域的主流语言的原因。
下面这个例子里展示了NumPy中二维数组的一些基本操作。
>>> import numpy
>>> a=numpy.arange(12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> type(a)
numpy.ndarray
>>> a.shape
(12,)
>>> a.shape=3,4
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[2]
array([ 8, 9, 10, 11])
>>> a[2,1]
9
>>> a[:,1]
array([1, 5, 9])
>>> a.transpose()
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
NumPy也支持加载、保存以及对所有元素的操作。
>>> floatnp=numpy.random.rand(10**7,)
>>> floatnp[-3:]
array([ 0.0739906 , 0.47402455, 0.37460871])
>>> floatnp *=.5
>>> floatnp[-3:]
array([ 0.0369953 , 0.23701227, 0.18730435])
>>> from time import perf_counter as pc
>>> t0=pc(); floatnp/=3; pc()-t0 #计算操作的耗时(秒)
0.026482352083847
>>> numpy.save('floats-10M',floatnp)
>>> floatnp2=numpy.load('floats-10M.npy','r+')
>>> floatnp2*=6
>>> floatnp2[-3:]
memmap([ 0.0739906 , 0.47402455, 0.37460871])
这里只是展示了NumPy最简单的内容,因为对于Python的array而言,如果不对NumPy做一个简单的介绍那将是不完整的。NumPy和SciPy都是非常强大的库,同时也是其他优秀工具如Pandas和Blaze的基础,值得用一整本书来介绍。