gpt4 book ai didi

生成大列表时出现python3 memoryerror

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:46 25 4
gpt4 key购买 nike

我是初学者。我最近看到 Mandelbrot set 太棒了,所以我决定用 python 绘制这个集合。但是有一个问题,当我运行这段代码时出现“内存错误”。

这条语句 num_set = gen_num_set(10000) 会产生一个大列表,大约 20000*20000*4 = 1600000000。当我使用 '1000' 而不是 '10000' 时,我可以成功运行代码.

我的电脑内存是4GB,操作系统是window7 32bit。我想知道这个问题是我电脑的限制还是有什么方法可以优化我的代码。

谢谢。

#!/usr/bin/env python3.4

import matplotlib.pyplot as plt
import numpy as np
import random,time
from multiprocessing import *

def first_quadrant(n):
start_point = 1 / n
n = 2*n
return gen_complex_num(start_point,n,1)

def second_quadrant(n):
start_point = 1 / n
n = 2*n
return gen_complex_num(start_point,n,2)

def third_quadrant(n):
start_point = 1 / n
n = 2*n
return gen_complex_num(start_point,n,3)

def four_quadrant(n):
start_point = 1 / n
n = 2*n
return gen_complex_num(start_point,n,4)

def gen_complex_num(start_point,n,quadrant):
complex_num = []
if quadrant == 1:
for i in range(n):
real = i*start_point
for j in range(n):
imag = j*start_point
complex_num.append(complex(real,imag))
return complex_num
elif quadrant == 2:
for i in range(n):
real = i*start_point*(-1)
for j in range(n):
imag = j*start_point
complex_num.append(complex(real,imag))
return complex_num
elif quadrant == 3:
for i in range(n):
real = i*start_point*(-1)
for j in range(n):
imag = j*start_point*(-1)
complex_num.append(complex(real,imag))
return complex_num
elif quadrant == 4:
for i in range(n):
real = i*start_point
for j in range(n):
imag = j*start_point*(-1)
complex_num.append(complex(real,imag))
return complex_num

def gen_num_set(n):
return [first_quadrant(n), second_quadrant(n), third_quadrant(n), four_quadrant(n)]

def if_man_set(num_set):
iteration_n = 10000
man_set = []
z = complex(0,0)
for c in num_set:
if_man = 1
for i in range(iteration_n):
if abs(z) > 2:
if_man = 0
z = complex(0,0)
break
z = z*z + c
if if_man:
man_set.append(c)
return man_set


def plot_scatter(x,y):
#plt.plot(x,y)

color = ran_color()
plt.scatter(x,y,c=color)
plt.show()

def ran_num():
return random.random()

def ran_color():
return [ran_num() for i in range(3)]

def plot_man_set(man_set):
z_real = []
z_imag = []
for z in man_set:
z_real.append(z.real)
z_imag.append(z.imag)
plot_scatter(z_real,z_imag)


if __name__ == "__main__":
start_time = time.time()
num_set = gen_num_set(10000)
with Pool(processes=4) as pool:
#use multiprocess
set_part = pool.map(if_man_set, num_set)
man_set = []
for i in set_part:
man_set += i
plot_man_set(man_set)
end_time = time.time()
use_time = end_time - start_time
print(use_time)

最佳答案

您说您正在创建一个包含 16 亿个元素的列表。其中每一个都是一个包含 2 个 float 的复数。一个 Python 复数需要 24 个字节(至少在我的系统上:sys.getsizeof(complex(1.0,1.0)) 给出 24),所以你需要超过 38GB只是为了存储值,而这甚至发生在您开始查看列表本身之前。

你的列表有 16 亿个元素,根本放不下 32 位系统(6.4GB,4 字节指针),所以你需要转到 64 位系统,8 字节指针,并且需要 12.8 GB 仅供引用。

因此,除非您升级到具有 64GB RAM 的 64 位操作系统(尽管它可能需要更多),否则您不可能这样做。

关于生成大列表时出现python3 memoryerror,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32045478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com