Мой цикл Python через фрейм данных со временем замедляется - PullRequest
1 голос
/ 10 июля 2019

Я перебираю очень большой фрейм данных (11361 x 22679) и преобразую значения каждой строки в пиксельное изображение, используя pyplot.В итоге у меня должно быть 11361 изображение с 151 х 151 пикселем (я добавляю 0 в конец, чтобы сделать его квадратным).allDF - это список из 33 DataFrames, которые соответствуют 33 подкаталогам в newFileNames, в которые нужно сохранить изображения.

Я пытался удалить каждый DataFrame и изображение в конце каждой итерации.Я пытался преобразовать значения с плавающей точкой в ​​int.Я пробовал gc.collect () в конце каждой итерации (хотя знаю, что это избыточно). Я принял меры, чтобы не сохранять никаких дополнительных значений, всегда ссылаясь на исходные данные.

Единственноеэто помогает, если я обрабатываю один кадр за раз.Он по-прежнему замедляется, но поскольку итераций меньше, он не такой медленный.Итак, я думаю, что проблема заключается во внутреннем цикле или одной из функций.

def shape_pixels(imglist):
    for i in range(122):
        imglist.append(0.0)
    imgarr = np.array(imglist).reshape((151,151))
    imgarr.reshape((151,151))
    return imgarr

def create_rbg_image(subpath,imgarr,imgname):
    # create/save image
    img = plt.imshow(imgarr, cmap=rgbmap)
    plt.axis('off')
    plt.savefig(dirpath+subpath+imgname,
                transparent=True,
                bbox_inches=0,pad_inches=0)

for i in range(len(allDF)):
    for j in range(len(allDF[i])):
        fname = allDF[i]['File Name'].iloc[j][0:36]
        newlist = allDF[i].iloc[j][1:].tolist()
        newarr = shape_pixels(allDF[i].iloc[j][1:].tolist())
        create_rbg_image(newFileNames[i]+'\\',shape_pixels(allDF[i].iloc[j][1:].tolist()),allDF[i]['File Name'].iloc[j][0:36])

Я хотел бы иметь возможность запустить код для всего набора данных и просто вернуться к нему, когда он будет сделан,но я пробежал всю ночь и прошел менее 1/3 пути.Если это продолжит замедляться, я никогда не буду готов.Первая минута генерирует более 150 изображений. Вторая генерирует 80. Затем 48, 32, 27 и т. Д., В конце концов, для создания всего одного требуется несколько минут.

Я не знаю

...