как ускорить многопроцессорный питон - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь сгенерировать изображение Мандельброта, но оно уходит на века.Код раздражающе медленный, поэтому, если вы можете помочь мне ускорить его, это было бы очень полезно.Благодарю.Обратите внимание, что код компилируется и запускается из моей IDE.Я новичок в многопроцессорности, поэтому, пожалуйста, немного потише.

def daemon_summoner(r):
'''allows code to be restarted with different file if crash during super high res generation'''
t = Thread(target=process_job(r))
t.start()


def process_job(r):
    """creates a slice of the set"""
    img = Image.new('1', size, color)  # B&W image
    print(int(r + 2*resolution100+1), 'of', int(resolution100 *3))
    r = r * 100
    for rval in range(100):
        for i in range(-resolution, resolution, 1):
            if abrot(((r + rval) / resolution), (i / resolution * 1j)):
                try:
                    img.putpixel((rval, i + resolution,), 0)
                except:
                    print(r, rval, i + resolution)
img.save(('z_images/' + str(resolution) + '/' + str(int(r/100)+int(resolution*.02)) + '.png'))


def abrot(x, y):
    """tests a point"""
    c = (x + y)
    z = 0 + 0j
    for _ in range(5):
        z = z * z + c
    if abs(real(z*z+c))>=2and abs(imag(z*z+c))>=2:
        return False
    for _ in range(int(resolution / 10)):
        if real(z + 0.0001) > float(real(z*z+c)) > real(z - 0.0001):
            return True
        z = z * z + c
        if abs(real(z)) >= 2:
            return False
    return True

1 Ответ

0 голосов
/ 30 декабря 2018

Итерации Мандельброта z * z + c могут потребоваться миллиарды операций для генерации одного изображения, поэтому первым шагом к ускорению этого процесса является удаление функции iterate_once и выполнение работы в потоке.

...