Производительность: сохранение миниатюр в файлах

proizvoditelnost sohranenie miniatjur v fajlah Экскурсия по tkinter, часть 1

В текущей реализации сценарий сохраняет созданные миниатюры в файлах, благодаря чему при следующем запуске они могут быть загружены значительно быстрее. Строго говоря, делать это совсем не обязательно — в примере 8.46 реализована измененная версия функции создания миниатюр, которая также генерирует изображения миниатюр в памяти, но не сохраняет их.

Для небольших коллекций изображений разница в скорости выполнения будет незаметна. Однако если испытать эти альтернативы на больших коллекциях изображений, можно будет заметить, что оригинальная версия в примере 8.45, сохраняющая и загружающая миниатюры из файлов, дает значительное преимущество в скорости. В одном из тестов с большой коллекцией файлов изображений на моем компьютере (примерно 320 цифровых фотографий на весьма, по общему мнению, медлительном ноутбуке) оригинальному сценарию потребовалось всего 5 секунд, чтобы открыть графический интерфейс (после первого запуска, в ходе которого было выполнено кэширование миниатюр), тогда как версии, представленной в примере 8.46, потребовалась 1 минута и 20 секунд: в 16 раз больше. Загрузка миниатюр из файлов выполняется значительно быстрее, чем операция изменения размеров.

Пример 8.46. PP4E\Gui\PIL\viewer-thumbs-nosave.py

то же самое, но не сохраняет и не загружает миниатюры из файлов:

для маленьких коллекций изображений, кажется, работает также быстро, но для больших коллекций, при сохранении миниатюр в файлах, запуск происходит намного быстрее; в некоторых приложениях (например, в веб-страницах) сохранение может оказаться насущной необходимостью

import os, sys

from PIL import Image from tkinter import Tk import viewer_thumbs

def makeThumbs(imgdir, size=(100, 100), subdir=’thumbs’):

создает миниатюры в памяти, но не сохраняет их в файлах

thumbs = []

for imgfile in os.listdir(imgdir):

imgpath = os.path.join(imgdir, imgfile)

try:

imgobj = Image.open(imgpath) # создать новую миниатюру imgobj.thumbnail(size) thumbs.append((imgfile, imgobj))

except: print(“Skipping: “, imgpath) return thumbs

if __name__ == ‘__main__’:

imgdir = (len(sys.argv) > 1 and sys.argv[1]) or ‘images’ viewer_thumbs.makeThumbs = makeThumbs

main, save = viewer_thumbs.viewer(imgdir, kind=Tk) main.mainloop()

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий