2.1 python数据类型
2.1.1 Python整形
Python使用C语言实现。其中,它的整型是一个C语言结构体,包含四部分:
1、ob_refcnt,它是一个引用计数,帮助python处理内存分配和回收;
2、ob_type, 它将变量类型编码;
3、ob_size,它指定接下来的数据成员大小;
4、ob_digit,包含我们希望python变量显示的实际整型值。
由此可见,与C相比,python存储一个整型,会带来一定的开销。这是因为,C语言中的整型,本质上是一个标签,而python中的整型则是一个指针,指向包含这个python类型所有信息的某一个内存体的位置。这是Python之所以可以自由地动态编码的原因所在,但是也带来了额外的开销。
2.1.2 Python列表
Python中的标准可变容器是列表。我们可以用下面的方式创建一个列表:
#创建一个从0到9的列表
L = list(range(10))
# 创建一个形如['0', '1', '2', '3'...'9']的列表
L2 = [str(c) for c in L]
甚至我们也可以创建一个异构类型的列表,也就是说,这个列表可以包含多个数据类型:
L3 = [True, "232", 3.4, 7]
这其中,每一项都是一个完整的对象。这样固然带来了灵活性,但是也会带来额外的开销。如果使用同一类型的数据,那么存储在固定类型的数组中应该更加高效。
2.1.3 Python中的固定类型数组
Python提供的array模块,可以用于创建同一类型的数组:
import array
L = list(range(10))
A = array('i', L) # 参数'i'用于指定类型为整型
更实用的做法是numpy中的ndarray数组。python数组对象可以存储一系列相同类型的数据,但是ndarray提供了高效的操作。下面,我们来看一下创建Numpy数组的方法。
2.1.4 创建ndarray数组
使用np.array从列表创建数组:
np.array([1, 2, 3, 4, 5]) # 必须是同一类型的数据
Numpy要求必须是同一类型的数据。如果不是,Numpy会进行向上兼容,例如整型创建为浮点型。如果希望某一类型,可以使用dtype关键字:
# 使用浮点数存储数据
np.array([1, 2, 3, 4, ], dtype='float32')
此外,也可以创建一个多维数组:
np.array([range(i, i+3) for i in [2, 4, 6]])
也可以从头创建数组,如:
1、创建一个长度为10的数组,数组值都是0:
np.zeros(10, dtype=int)
2、创建一个3*5的数组,数组值都是1:
np.ones((3, 5), dtype=int)
3、创建一个3*5的浮点数数组,数组值都是3.14:
np.full((3, 5), dtype=float32)