Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的Python for循环导致内存错误。我如何优化它?_Python_Optimization_Memory_Out Of Memory - Fatal编程技术网

我的Python for循环导致内存错误。我如何优化它?

我的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

我正试图编制一份苹果设备将拥有的所有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 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,但从我目前发现的情况来看,苹果似乎没有特定的设备使用范围。这并没有回答问题。你为什么需要这些苹果机?为什么需要提前列举它们?你打算用它们做什么?