如何减少python中的运行时间?

时间:2018-03-09 09:10:00

标签: python algorithm performance networking operating-system

我有以下程序生成1亿个mac并将其附加到列表中。

但是1亿mac的生成和插入本身需要大约7分钟的python ???

    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方法后的时间戳

100000000。 < ----总条目数。 1亿

所以问题是:

  1. 如何在python中将运行时间从7分钟缩短到最低?

  2. 如果我在C或C加上解决同样的问题请给我一些基本的解决方案吗?

  3. 当为10亿mac运行相同的代码时,它会自动终止,我相信。并花更多的时间。如何实现10亿代mac?

  4. 提前致谢

3 个答案:

答案 0 :(得分:5)

您遇到的漫长运行时间很可能是因为内存被分页到您的硬盘驱动器,以便为mac_list添加新项目腾出空间。

我想不出有什么理由需要将所有这些MAC存储在内存中。它们是连续编号的,因此您可以轻松地生成它们:

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

然后,不要从mac_list中提取项目,而只需使用此功能。换句话说,替换

m = mac_list[12345678]

m = gen_mac(12345678)

答案 1 :(得分:1)

以下代码在我的笔记本电脑上使用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])

答案 2 :(得分:1)

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

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

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

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