Шаблоны помех веселые, не правда ли?
Итак, во-первых, это будет незначительно, потому что запуск этой программы на моем ноутбуке занимает всего двенадцать с половиной секунд.
Но давайте посмотрим, что можно сделать с выполнением первого бита с помощью операций с массивами, не так ли? У нас есть в основном то, что вы хотите:
arr[i][j] = abs(hypot(i-s1x,j-s1y) - hypot(i-s2x,j-s2y))
Для всех i
и j
.
Итак, поскольку numpy имеет функцию hypot
, которая работает с массивами numpy, давайте использовать это. Наша первая задача - получить массив правильного размера с каждым элементом, равным i
, а другой - с каждым элементом, равным j
. Но это не так уж сложно; на самом деле, ответ ниже указывает мне на чудесный numpy.mgrid
, о котором я раньше не знал, который делает именно это:
array_i,array_j = np.mgrid[0:width,0:height]
Существует небольшой вопрос о том, чтобы сделать массив размером (width, height)
в (width,height,3)
, чтобы он был совместим с вашими утверждениями генерации изображений, но это довольно легко сделать:
arr = (arr * np.ones((3,1,1))).transpose(1,2,0)
Затем мы подключаем это к вашей программе и позволяем выполнять операции с массивами:
import math, array
import numpy as np
from PIL import Image
size = (800,800)
width, height = size
s1x = width * 1./8
s1y = height * 1./8
s2x = width * 7./8
s2y = height * 7./8
r,g,b = (255,255,255)
array_i,array_j = np.mgrid[0:width,0:height]
arr = np.abs(np.hypot(array_i-s1x, array_j-s1y) -
np.hypot(array_i-s2x, array_j-s2y))
arr = (arr * np.ones((3,1,1))).transpose(1,2,0)
arr2 = np.zeros((width,height,3),dtype="uint8")
for ld in [200,116,100,84,68,52,36,20,8,4,2]:
print 'now computing image for ld = '+str(ld)
# Rest as before
И новое время ... 8,2 секунды. Таким образом, вы экономите, может быть, четыре целых секунды. С другой стороны, сейчас это почти исключительно на этапах генерации изображений, поэтому, возможно, вы можете усилить их, создавая только те изображения, которые вам нужны.