我有以下程序生成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亿
所以问题是:
如何在python中将运行时间从7分钟缩短到最低?
如果我在C或C加上解决同样的问题请给我一些基本的解决方案吗?
当为10亿mac运行相同的代码时,它会自动终止,我相信。并花更多的时间。如何实现10亿代mac?
提前致谢
答案 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
':'
无用的分隔符。