我正在尝试编译Apple设备将拥有的所有MAC地址的列表。 oui.txt
告诉我Apple已经分配了77个MAC范围。这些范围的形式为:
00:00:00
00:11:11
etc...
这留下了要追加的最后三个HEX数字。那是16^6
。共有1291845632个Apple MAC地址。
我遇到的问题是编写一个程序来创建这些MAC地址的列表。这是我目前的代码:
import re
apple_mac_range = []
apple_macs = []
# Parse the HTML of http://standards.ieee.org/cgi-bin/ouisearch to get the MACs
with open('apple mac list', 'r') as f:
for line in f.readlines():
match = re.search(r'[\w\d]{2}-[\w\d]{2}-[\w\d]{2}', line)
if match:
apple_mac_range.append(match.group().split('-'))
for mac in apple_mac_range:
for i in range(1, 1291845633):
print i
这给了我一个MemoryError
...我该如何优化它?
答案 0 :(得分:18)
range(1, 1291845633)
一次创建1,291,845,632个元素(几GB)的列表。改为使用xrange(1, 1291845633)
,它会根据您的需要生成元素,而不是一次生成元素。
无论如何,看起来你想要更像这样的东西:
for mac in apple_mac_range:
for i in xrange(16777216):
print mac, i
当然,1.3e + 9 MAC地址列表很可能不会非常有用。如果您想查看给定的MAC地址是否为Apple设备,您应该检查3字节前缀是否在77的列表中。如果您尝试通过提供路由器或其他东西来进行访问控制所有可能的MAC地址列表,设备不太可能接受其列表中的1.3e + 9项。
答案 1 :(得分:3)
其他人已经回答了你的实际的问题,但我不确定这是什么在这里得到保证。为什么不创建一个实现__contains__
的类来以算法方式测试MAC地址?我认为你得到了一个MAC而你想测试它是否可能是一个iPhone MAC,所以你可以实现那个类,然后做一些像:
if found_mac in MACTester:
...do work...
或者如果你真的想要一个可迭代的序列,你至少应该使用一个生成器,而不是真正尝试将它们全部放在内存中。
答案 2 :(得分:1)
怎么样:
i = 0
while i < 1291845633:
print i
i += 1
答案 3 :(得分:1)
不要使用readlines
with file('apple mac list') as f:
for x in f:
print x
答案 4 :(得分:0)
嗯,首先,range(1, 1291845633)
创建一个包含大约十亿个条目的列表。由于每个条目至少为sizeof(Py_Object)
,因此直接运行内存并不太令人惊讶。不要那样做。