我的Python for循环导致内存错误。我如何优化它?
我正试图编制一份苹果设备将拥有的所有MAC地址的列表我的Python for循环导致内存错误。我如何优化它?,python,optimization,memory,out-of-memory,Python,Optimization,Memory,Out Of Memory,我正试图编制一份苹果设备将拥有的所有MAC地址的列表oui.txt告诉我,苹果已经被分配了77个MAC系列使用。这些范围的形式如下: 00:00:00 00:11:11 etc... 这就剩下最后三个十六进制数字了。这是16^6。总共有1291845632个苹果MAC地址 我遇到的问题是编写一个程序来创建这些MAC地址的列表。以下是我当前的代码: import re apple_mac_range = [] apple_macs = [] # Parse the HTML of
oui.txt
告诉我,苹果已经被分配了77个MAC系列使用。这些范围的形式如下:
00:00:00
00:11:11
etc...
这就剩下最后三个十六进制数字了。这是16^6
。总共有1291845632个苹果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
这给了我一个记忆错误
。。。如何优化它?范围(11291845633)一次创建1291845632个元素(几GB)的列表。改用xrange(11291845633)
,它将根据需要生成元素,而不是一次生成所有元素
不管怎么说,看起来你想要的东西更像这样:
for mac in apple_mac_range:
for i in xrange(16777216):
print mac, i
当然,1.3e+9个MAC地址的列表很可能不是很有用。如果你想知道一个给定的MAC地址是否是苹果设备,你应该检查一下3字节前缀是否在77个字节的列表中。如果您试图通过向路由器或其他设备提供所有可能MAC地址的列表来进行访问控制,则设备不太可能接受列表中的1.3e+9项。如何:
i = 0
while i < 1291845633:
print i
i += 1
i=0
而我<1291845633:
打印i
i+=1
不要使用读线
with file('apple mac list') as f:
for x in f:
print x
首先,
range(11291845633)
创建了一个包含10亿个条目的列表。由于每个条目至少是sizeof(Py_对象)
,所以内存不足也就不足为奇了。不要那样做。其他人已经回答了你的实际问题,但我不确定这是否是有理由的。为什么不创建一个实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?我假设你得到的是一台MAC电脑,你想测试它是否可能是一台iPhone MAC电脑,所以你可以实现这个类,然后做如下操作:
if found_mac in MACTester:
...do work...
或者,如果你真的想要一个iterable序列,你至少应该使用一个生成器,而不是实际尝试将它们全部放在内存中。你到底为什么要生成所有这些MAC地址的完整列表?为什么需要枚举超过十亿个地址?你真正想解决的问题是什么?嗯,我真的只想要iPhone设备的Mac,但从我目前发现的情况来看,苹果似乎没有特定的设备使用范围。这并没有回答问题。你为什么需要这些苹果机?为什么需要提前列举它们?你打算用它们做什么?