如何在Python中减少运行时间?

2024-04-18 13:54:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的程序,它可以生成1亿台mac并将其添加到列表中。在

但是在python中,1亿台mac的生成和插入需要大约7分钟的时间???在

    import datetime
    def mac_gen():
    hex_byte1=0
    hex_byte2=0
    hex_byte3=0
    hex_byte4=0
    hex_byte5=0
    hex_byte6=0
    hex_byte7=0
    hex_byte8=0
    hex_byte9=0
    hex_byte10=0
    hex_byte11=0
    hex_byte12=0
    total_mac = 0
    for hex_byte_12 in range(0,16):
        for hex_byte11 in range(0,16):
            for hex_byte10 in range(0,16):
                for hex_byte9 in range(0,16):
                    for hex_byte8 in range(0,16):
                        for hex_byte7 in range(0,16):
                            for hex_byte6 in range(0,16):
                                for hex_byte5 in range(0,16):
                                    for hex_byte4 in range(0,16):
                                        for hex_byte3 in range(0,16):
                                            for hex_byte2 in range(0,16):
                                                for hex_byte1 in range(0,16):
                                                    total_mac +=1;
                                                    if total_mac > number_of_mac_to_print:
                                                       return
                                                    mac_list.append("%X%X:%X%X:%X%X:%X%X:%X%X:%X%X" %(hex_byte_12,hex_byte11,hex_byte10,hex_byte9,hex_byte8,hex_byte7,hex_byte6,hex_byte5,hex_byte4,hex_byte3,hex_byte2,hex_byte1))

mac_list=list()
number_of_mac_to_print = 100000000
print(datetime.datetime.utcnow())
mac_gen()
print(datetime.datetime.utcnow())
print(len(mac_list))

输出:

2018-03-09 07:15:41.650460<;——调用mac峎gen方法前的时间戳

2018-03-09 07:22:33.902744<;——调用macĒgen方法后的时间戳

1亿美元。<;----项目总数。1亿

所以问题是:

  1. 如何将python的运行时间从最短的7分钟减少到尽可能少?

  2. 如果同一个问题我在C或C plus中解决,请给我一个通用的解决方案?

  3. 当在10亿台mac上运行相同的代码时,我相信它会自动终止。而且要花更多的时间。如何实现10亿台mac电脑的生产?

提前谢谢


Tags: infordatetimemac时间rangelistgen
3条回答

下面的代码在我的笔记本上花了3:20

mac_list=list()
for i in range(0, 100000000):
    strHex = hex(i)[2:].rjust(12, '0')
    mac_list.append(strHex[0:2] + ":"+strHex[2:4] + ":"+strHex[4:6] + ":"+strHex[6:8] + ":"+strHex[8:10] + ":"+strHex[10:12])

你确定要这么做吗?所有12位的十六进制数将填满最大的超级计算机(281474976710656值)。实际上,所有的第一个100000000地址的前五个数字都是零(如16^7 = 268435456)。在

你真的需要存储所有这些地址吗?如果是,我建议使用单个range(100000000),并将值保留为整数,只在需要时转换为十六进制。这会节省很多空间。在

如果不可能,使用一个自己递增的12十六进制字符字符串,而不是使用昂贵的格式化操作,这可能更有效。在

请不要存储那些500000000':'无用的分隔符。在

您所经历的长时间运行很可能是由于内存被调出到硬盘上,以便为向mac_list添加新项目腾出空间。在

我想不出有什么好理由让你把这些Mac电脑都存储在内存中。它们是连续编号的,因此您可以轻松地动态生成它们:

gen_mac = lambda n: ":".join([("%012X" % n)[i:i+2] for i in range(0,12,2)])

然后,不要从mac_list获取项目,只需使用此函数。换言之,替换

^{pr2}$

m = gen_mac(12345678)

相关问题 更多 >