2009-12-29 3 views
0

Я создаю онлайн-просмотрщик шрифтов со следующей архитектурой. Я завернул функцию создания предварительного просмотра в автономном .py-файле и сделал системные вызовы для него в представлении Django, чтобы запускать их в параллельной и максимальной производительности в многоядерной системе ЦП.Оптимизация кода на Python

preview.py

.... 
def make_preview(text, fontfile, imagefile, fontsize=30): 
    try: 
     font = ImageFont.truetype(fontfile, fontsize) 
     text_width, text_height = font.getsize(text) 
     img = Image.new('RGBA', (text_width, text_height)) 
     draw = ImageDraw.Draw(img) 
     draw.text((0, 0), text, font=font, fill=(0, 0, 0)) 
     return True 
    except: 
     return False 
if __name__=='__main__': 
    make_preview(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) 

views.py

... 
def ajax_preview(resquest): 
    ttf_file_list = [construct a list of .ttf files] 
    image_list = [] 
    for ttf_file in ttf_file_list: 
     image_file = ttf_file.replace('.ttf', '.png') 
     image_list.append(image_file) 
     subprocess.Popen(['python', 'preview.py', text, ttf_file, image_file, 30) 
    return HttpResponse(image_list) 

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

ответ

2

Вы должны изучить модуль multiprocessing. Вы можете создать пул работников, равный количеству ядер ЦП, а затем отправить задания в свою функцию make_preview.

+0

Согласен. Сделайте несколько параллельно, чтобы сэкономить время. – steveha

0

Если это выбор шрифта, где вы можете разумно отображать один и тот же текст при каждом его отображении, вы можете предварительно отобразить образцы шрифтов и сохранить результаты в виде файлов .PNG или .GIF. (Вы не хотите использовать изображения JPEG, потому что они будут размыты ваши шрифты, JPEG-файлы будут использовать сжатие с потерями.)

Затем вы можете сделать свой выбор шрифта блоком предварительно обработанного HTML, который относится к предварительно рендерному превью изображений.

Вам нужно будет только сгенерировать предварительный просмотр при установке или удалении шрифтов из вашей системы.

+0

еще лучше, шрифты, которые еще не имеют изображения (или не могут быть найдены по какой-либо причине), могут отображаться как прежде. – Matthew

+0

@steveha, это выбор шрифта, но он работает, создавая изображения предварительного просмотра для отправленного пользователем текста динамически. Таким образом, сохранение изображений .PNG для следующего использования времени не поможет в этом случае. – jack

+0

@jack, в настоящее время он использует текст, представленный пользователем. Вопрос в том, можете ли вы изменить его, чтобы всегда показывать один и тот же текст? Потому что это обеспечит огромное ускорение. Как пользователь, я не возражаю, если редактор шрифтов не отображает мой текст; он может отображать некоторый образец текста. Если он должен показывать текст пользователя, вы не можете кэшировать его, и его будет сложно ускорить. Если вы не можете кэшировать его, лучшим вариантом будет написать программу на языке C, которая делает весь предварительный просмотр за один шаг, в идеале - многопоточную программу на C. Но будут ли ваши пользователи действительно заботиться, если в предварительном просмотре просто указывается «Пример текста 1234» в каждом шрифте? – steveha

Смежные вопросы