Параллельный Python для создания фрактала и ресурса, сериализованного под pp

Я делаю один скрипт на Python для создания фрактального изображения.

Я пытаюсь использовать модуль pp python, чтобы сделать этот исходный код быстрее.

Большая проблема: image.putpixel ((x, y), (i% 8 * 16, i% 4 * 32, i% 2 * 64)). Эта строка исходного кода, когда используется как работа, дает мне кое-что о:cPickle.UnpickleableError: Невозможно выбирать объекты.

Я думаю, что этот ресурс не может быть сериализован под стр. Любая идея? Спасибо. С уважением.

Мой исходный код:

from PIL import Image
#size of image
imgx = 600
imgy = 400
#make image buffer
image = Image.new("RGB", (imgx, imgy))

# area of fractal
xa = -2.0
xb = 2.0
ya = -2.0
yb = 2.0

#define constants
max_iterations = 10 # max iterations allowed
step_derivat = 0.002e-1 # step size for numerical derivative
error = 5e-19 # max error allowed

# function will generate the newton fractal
def f(z): return z * z  +complex(-0.31,0.031)

# draw derivate fractal for each y and x 
for y in range(imgy):
 zy = y * (yb - ya)/(imgy - 1) + ya
 for x in range(imgx):
  zx = x * (xb - xa)/(imgx - 1) + xa
  z = complex(zx, zy)
  for i in range(max_iterations):
   # make complex numerical derivative
   dz = (f(z + complex(step_derivat, step_derivat)) - f(z))/complex(step_derivat,step_derivat)
    # Newton iteration see wikipedia   
   z0 = z - f(z)/dz 
   # stop to the error 
   if abs(z0 - z) < error: 
    break
   z = z0
  #I use modulo operation expression to do RGB colors of the pixels 
  image.putpixel((x, y), (i % 8 * 16, i % 4 * 32,i % 2 * 64))

#save the result 
image.save("fractal.png", "PNG")

1 ответ

Решение

Параллельный Python или модуль многопроцессорной обработки требуют, чтобы объекты, которые необходимо передать другим процессам, можно было выбирать, а объект изображения из PIL - нет.

Я рекомендую удалить вызов image.putpixel из функции, подлежащей распараллеливанию, и вернуть ее в простой список точек RGB или массива, который можно выбрать. Затем, после выполнения расчетов, вы можете собрать изображение.

Кроме того, чтобы получить более конкретный совет, вы также должны опубликовать параллельную версию кода.

Другие вопросы по тегам