Pull to refresh

Производительность Python 3: Отвлекающий маневр

Reading time2 min
Views1.4K
Original author: Michael Watkins
Я имел неосторожность обращать пристальное вынимание на производительность языка, но этого больше не повторится. Для работы, которую я делаю, производительность разработки гораздо более значима, чем производительность самого языка. Меня совершенно не беспокоит, что Python 3 чуть-чуть медленнее, чем последний 2.x релиз, который используется в продакшн(2.5). История показала, что разработчики Python достаточно хороши в оптимизации и теперь, когда язык стабилизировался, мы можем рассчитывать на большое количество оптимизаций в 3-ей ветке.


Python 3 на сегодняшний день не такой уж медленный. Для работы, которой я занимаюсь — разработка веб приложений — я нахожу что первый релиз Python 3 по грубым оценкам эквивалентен Python 2.5.x, и это гораздо более важно для меня, чем оценка при помощи pystone или какие-либо другие абстрактные измерения.

Тест #1: pystone


Что касается pystone, вот результаты на старой однопроцессорной Unix-машине, которую я использую:

$ python2.5 /usr/local/lib/python2.5/test/pystone.py
Pystone(1.1) time for 50000 passes = 1.75781
This machine benchmarks at 28444.4 pystones/second

$ python2.6 /usr/local/lib/python2.6/test/pystone.py
Pystone(1.1) time for 50000 passes = 1.46094
This machine benchmarks at 34224.6 pystones/second

$ python3.0 /usr/local/lib/python3.0/test/pystone.py
Pystone(1.1) time for 50000 passes = 1.85938
This machine benchmarks at 26890.8 pystones/second

Тест #2: веб приложение


Обязывающий(хотя и грубый) тест веб проложения — получение вики-страницы, на все той же старой машине, в то время как gvim и некоторые другие приложения так же запущены.

ab -n 1000 127.0.0.1:8002/qwiki/foo/

Req/second
Python 2.5 174.79
Python 2.6 204.29
Python 3.0 173.49

Тест #3: шаблон веб фреймворка


Данный тест базируется на тесте шаблона, включенном в пакет Genshi и использует модуль timeit, считая среднее значение времени 10 запусков создания большой html таблицы используя следующий Qpy шаблон:

# this is to provide a Qpy template for use in comparison
# with the Genshi "bigtable" benchmark.

table = [dict(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10)
          for x in range(1000)]

def qpy_template:xml():
    '<table>'
    for row in table:
        '<tr>'
        for col in row.values():
            '<td>%s</td>' % col
        '</tr>'
    '</table>'

Можно увидеть, что Qpy не единственный модуль, который получил прирост в производительности в Python 2.6 и Python 3.0, и я уверен, что будут приложены усилия по оптимизации, чтобы вернуть производительность некоторых модулей на прежний уровень.

$ python2.5 bigtable.py
ElementTree 736.43 ms
cStringIO 36.46 ms
StringIO 141.10 ms
list concat 22.73 ms
Qpy Template 129.35 ms

$ python2.6 bigtable.py
ElementTree 656.99 ms
cStringIO 30.85 ms
StringIO 131.95 ms
list concat 16.37 ms
Qpy Template 39.54 ms

$ python3.0 bigtable.py
ElementTree 449.60 ms
StringIO 138.03 ms
list concat 21.70 ms
Qpy Template 36.36 ms


Вывод


Существуют веские причины по которым кто-то может выбрать Python 2.x вместо Python 3.0, но производительность не будет одной из них для большинства разработчиков.
Tags:
Hubs:
Total votes 17: ↑17 and ↓0+17
Comments3

Articles