Python中数组(array)与列表(list)的对比

本文探讨了Python的array模块,介绍了如何创建和操作数组,包括类型码、数组的追加、拼接以及索引等基本操作。通过性能测试比较了array与list在创建、遍历、随机访问和追加操作上的效率,结果显示虽然list在大多数操作上速度更快,但array在内存使用上更优。文章强调了在特定场景下选择合适的数据结构对于程序性能的重要性。
摘要由CSDN通过智能技术生成
import array as arr # (1)
import random
import time
from array import array

# 获取包含可用类型码的字符串, 各类型码详细信息键下方文档注释
codes = arr.typecodes
print(codes)

# 使用array模块下的array类构建一个数组
# 参数列表: 类型码, 初始化器 (其中初始化器为可迭代对象,官方文档说其必须为列表)
a = array('i', range(101))


# array类的重写的__str__方法返回的字符串可以作为eval函数的参数来构建一个新的数组
# 前提是要保证数组在命名空间下的名称为 array(个人感觉这个类的名称应为Array,
# array.array感觉很奇怪,而且容易与其所在模块名冲突。只能通过 (1) 的方式解决)
print(eval(str(a)))


# 使用ArrayType构建一个指定类型的空数组
a0 = arr.ArrayType('i') # 或 array('i')
try:
    # 追加一个元素,当元素类型与数组类型不一致时会抛出TypeError
    a0.append('ss')
except BaseException as e:
    print(e)

a0.append(10)
print(a0)

# 数组也重载了 + 运算符,可以将两个数组拼接在一起
a0 += array('i', [1, 2, 1])
print(a0)


# 索引与切片, 其他序列结构该有的操作数组也一样
print(a0[-1], '\t', a0[::-1])


# 性能测试(与列表对比),
def get_runtime(func, *args, **kwargs):
    begin = time.time()
    func(*args, **kwargs)
    return time.time() - begin
gr = get_runtime

# 双方各做一千万次操作
r = range(10000000)

# 创建
def arr_test0():
    a = array('i', r)

def list_test0():
    a = list(r)

print(gr(arr_test0), '\t', gr(list_test0))


# 遍历
a = array('i', r)
l = list(r)

def arr_test1():
    for i in a:
        x = i

def list_test1():
    for i in l:
        x = i

print(gr(arr_test1), gr(list_test1))


# 随机访问
len_ = len(r) - 1
def arr_test2():
    for i in r:
        x = a[111]

def list_test2():
    for i in r:
        x = l[111]

print(gr(arr_test2), gr(list_test2))


# 追加
def arr_test3():
    for i in r:
        a.append(i)

def list_test3():
    for i in r:
        l.append(i)

print(gr(arr_test3), gr(list_test3))


# 插入
# 数组一千万次插入太耗时间了...
r = range(300000)
def arr_test4():
    for i in r:
        a.insert(len(l) - 100, i)

def list_test4():
    for i in r:
        l.insert(len(l) - 100, i)

print(gr(arr_test4), gr(list_test4))

'''
测试结果:  数组                       列表
    创建: 0.6748077869415283 	    0.21828913688659668
    遍历: 0.19733977317810059        0.10963153839111328
    随机访问: 0.4087049961090088      0.33188533782958984
    追加: 1.088365077972412          0.6737616062164307
    插入(30万次): 5.103848457336426   0.08870291709899902
    
    其实测试的数据应以双方耗时的比值作为最终结果显示
    不然不同硬件配置的电脑及不同的解释器测试的结果差异还是较大的
    从测试结果不难看出,列表在各应用场景下的效率是高与数组的
    但这也只是千万量级的比对,真实的程序下其实用数组还是列表在时间上的
    差异还是可以忽略不计的,但各位,别忽略了一点: 相同长度下,数组要比列
    表节省一半的内存! 因为数组有数据类型的约束,整数即 int(
    -2^31 ~ 2^31 - 1)4个字节就足以满足一般程序的使用,但Python中的int至少占用24个字节,在列表中的int平均占用8个字节
'''

'''
C类型中的u代表unsigned,类型码在python代码中的表述格式为字符串
其中wchar_t由于平台不同它可能为2或4字节

类型码         C类型             Python类型            字节大小
b             char             int                   1
B             u char           int                   1
u             wchar_t          Unicode               2
h             short            int                   2
H             u short          int                   2
i             int              int                   4
I             u int            int                   4
l             long             int                   4
L             u long           int                   4
q             long long        int                   8
Q             u long long      int                   8
f             float            float                 4
d             double           float                 8
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值