python创建长度为20的列表_如何在python中创建固定大小列表?

小编典典

(tl;博士:您问题的确切答案是numpy.empty或numpy.empty_like,但您可能不在乎,可以摆脱使用的困扰myList =

[None]*10000。)

简单的方法

您可以将列表初始化为所有相同的元素。使用非数字值在语义上有意义(如果使用它会在以后产生错误,这是一件好事)或类似0的值(不寻常?如果您正在编写稀疏矩阵或’默认值应为0,并且您不必担心错误)由您自己决定:

>>> [None for _ in range(10)]

[None, None, None, None, None, None, None, None, None, None]

(这里_只是一个变量名,您可以使用i。)

您也可以这样:

>>> [None]*10

[None, None, None, None, None, None, None, None, None, None]

您可能不需要优化它。您还可以在每次需要时追加到数组:

>>> x = []

>>> for i in range(10):

>>> x.append(i)

简单方法的性能比较

哪个最好?

>>> def initAndWrite_test():

... x = [None]*10000

... for i in range(10000):

... x[i] = i

...

>>> def initAndWrite2_test():

... x = [None for _ in range(10000)]

... for i in range(10000):

... x[i] = i

...

>>> def appendWrite_test():

... x = []

... for i in range(10000):

... x.append(i)

python2.7中的结果:

>>> import timeit

>>> for f in [initAndWrite_test, initAndWrite2_test, appendWrite_test]:

... print('{} takes {} usec/loop'.format(f.__name__, timeit.timeit(f, number=1000)*1000))

...

initAndWrite_test takes 714.596033096 usec/loop

initAndWrite2_test takes 981.526136398 usec/loop

appendWrite_test takes 908.597946167 usec/loop

python 3.2中的结果:

initAndWrite_test takes 641.3581371307373 usec/loop

initAndWrite2_test takes 1033.6499214172363 usec/loop

appendWrite_test takes 895.9040641784668 usec/loop

正如我们所看到的,最好[None]*10000在python2和python3中都做习惯用法。但是,如果执行的工作比分配还要复杂(例如,要生成或处理列表中的每个元素都比较复杂),那么开销将占成本的一小部分。也就是说,如果您对列表中的元素进行任何合理的处理,现在就担心此类优化还为时过早。

未初始化的内存

但是这些都是低效的,因为它们要经过内存,在过程中写一些东西。在C语言中这是不同的:未初始化的数组填充有随机垃圾存储器(注:已从系统重新分配,并且当您分配或无法锁住和/或无法在关闭程序时删除内存时可能存在安全风险))。这是一个旨在提高速度的设计选择:C语言的开发人员认为最好不要自动初始化内存,这是正确的选择。

这不是渐近的加速(因为是O(N)),但是例如,在用实际关心的内容覆盖之前,您不需要先初始化整个内存块。如果可能的话,这等效于(pseudo-

code)之类的东西x = list(size=10000)。

如果要在python中使用类似的东西,可以使用numpy数值矩阵/

N维数组操作包。具体来说,numpy.empty或numpy.empty_like

那是您问题的真正答案。

2020-12-20

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值