В текущей реализации сценарий сохраняет созданные миниатюры в файлах, благодаря чему при следующем запуске они могут быть загружены значительно быстрее. Строго говоря, делать это совсем не обязательно — в примере 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