为了账号安全,请及时绑定邮箱和手机立即绑定

快速创建带有序列号的列表

快速创建带有序列号的列表

侃侃无极 2021-06-11 17:29:12
from time import timemylist1 = []mylist2 = []start1 = time()for i in range(100000000):    mylist1.append(i)end1 = time()start2 = time()mylist2 = [0] * 100000000end2 = time()print(end1-start1, end2-start2)当我对两个操作进行计时以填充列表时,使用 for 循环需要 14 秒,使用 for 循环需要 0.5 秒 mylist2 = [0] * 100000000因此,如果我需要一次插入大量项目,则使用第二种方法似乎很明显。但是如果我做第二件事,我必须为所有人插入相同的数字,或者手动输入会重复的数字。有没有办法执行for i in range(100000000):    mylist1.append(i)这个动作导致 [0,1,2,3,...,n] 速度快?如果速度很快,代码不一定要很短。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

尝试列出range输出:


mylist3 = list(range(100000000))

我将此添加到您的测试中并获得了以下时间:


append: 18.42

all-0:   0.23

list:    2.63       <== The new one


查看完整回答
反对 回复 2021-06-22
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

既然你说你需要速度,我认为这np.arange是最好的方法,它甚至比创建所有0s的列表还要快。这是我机器上的时间:


import timeit

import numpy as np


def m1(n=100000000):

    mylist = []

    for i in range(n):

        mylist.append(i)

    return mylist


def m2(n=100000000):

    return [0] * n


def m3(n=100000000):

    return list(range(n))


def m4(n=100000000):

    return np.arange(n)


>>> timeit.timeit(m1,number=1)

17.615584995000972

>>> timeit.timeit(m2,number=1)

0.7669911839911947

>>> timeit.timeit(m3,number=1)

9.909814337006537

>>> timeit.timeit(m4,number=1)

0.5374436590063851

请注意,np.arange()返回一个np.array. 如果您需要将其转换回列表,则会失去速度。最好只使用数组...


def m4(n=100000000):

    return np.arange(n).tolist()


>>> timeit.timeit(m4,number=1)

11.485261309993803


查看完整回答
反对 回复 2021-06-22
  • 3 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号