За и против разных подходов к веб-программированию в Python

То, что dot-product существенно выполняет редукцию вдоль axis=1 двух входных массивов. Размеры могут быть представлены так:

arr_in   :     n   3 
matrices : n   3   3

. Таким образом, одним из способов его решения было бы «нажимать» размеры arr_in вперед на один axis/dimension, создавая таким образом одноэлементное измерение в axis=2 в версии 3D-массива. Тогда сумма, уменьшающая элементы вдоль axis = 1, даст нам желаемый результат. Покажем это -

arr_in   : n   [3]   1 
matrices : n   [3]   3

Теперь это может быть достигнуто двумя способами.

1) С помощью np.einsum -

np.einsum('ij,ijk->ik',arr_in,matrices)

2) С помощью NumPy broadcasting -

(arr_in[...,None]*matrices).sum(1)

Проверка времени выполнения и проверка вывода (для версии einsum) -

In [329]: def loop_based(arr_in,matrices):
     ...:     arr_out = np.zeros((arr_in.shape[0], 3))
     ...:     for i in range(arr_in.shape[0]):
     ...:         arr_out[i] =  np.dot(arr_in[i], matrices[i])
     ...:     return arr_out
     ...: 
     ...: def einsum_based(arr_in,matrices):
     ...:     return np.einsum('ij,ijk->ik',arr_in,matrices)
     ...: 

In [330]: # Inputs
     ...: N = 16935
     ...: arr_in = np.random.randn(N, 3)
     ...: matrices = np.random.randn(N, 3, 3)
     ...: 

In [331]: np.allclose(einsum_based(arr_in,matrices),loop_based(arr_in,matrices))
Out[331]: True

In [332]: %timeit loop_based(arr_in,matrices)
10 loops, best of 3: 49.1 ms per loop

In [333]: %timeit einsum_based(arr_in,matrices)
1000 loops, best of 3: 714 µs per loop

25
задан Jonik 10 June 2009 в 17:53
поделиться

9 ответов

CGI является большим для веб-сайтов низкого трафика, но он имеет некоторые проблемы производительности для чего-либо еще. Это вызвано тем, что каждый раз запрос входит, сервер запускает приложение CGI в своем собственном процессе. Это плохо по двум причинам: 1) Запуск и остановка процесса могут занять время и 2) Вы ничего не можете кэшировать в памяти. Можно пойти с FastCGI, но я утверждал бы, что Вы будете более обеспечены просто запись прямого приложение WSGI , если Вы соберетесь пойти тем путем (способ, которым работы WSGI действительно не являются целым, чертовски много отличающимся от CGI).

Кроме этого, Ваш выбор состоит по большей части в том, сколько Вы хотите, чтобы платформа сделала. Можно пойти со всем пением, всей платформой танца как Django или Опоры. Или можно пойти с подходом смешивания и подгонки (используйте что-то как CherryPy для материала HTTP, SQLAlchemy для материала базы данных, вставка для развертывания, и т.д.). Я должен также указать, что большинство платформ также позволит Вам выключить различные компоненты для других, таким образом, эти два подхода будут не обязательно взаимоисключающими.

Лично, мне не нравятся платформы, которые делают слишком много волшебства для меня и предпочитают метод смешивания и подгонки, но мне сказали, что я также абсолютно безумен.:)

, Сколько опыта веб-программирования Вы имеете? Если Вы - новичок, я говорю, идут с Django. Если Вы более опытны, я говорю для игры вокруг с разными подходами и методами, пока Вы не находите правильный.

17
ответ дан Jason Baker 28 November 2019 в 20:52
поделиться

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

Каждый повышается от этого, встраивает Ваш код Python в Ваш код HTML, такой как с PSP. Я не думаю, что многие люди используют это в наше время, так как современные шаблонные системы сделали это довольно устаревшим. Я работал с PSP некоторое время и нашел, что он имел в основном те же организационные пределы как сценарии CGI (каждая страница имеет свой собственный файл) плюс некоторые связанные с пробелом раздражения от попытки смешать неосведомленный пробелу HTML с чувствительным к пробелу Python.

следующие повышаются, очень простые веб-платформы, такие как web.py, который я также использовал. Как сценарии CGI, очень просто разбудить что-то и выполнение, и Вам не нужны никакая сложная конфигурация или автоматически сгенерированный код. Ваш собственный код будет довольно прост понять, таким образом, Вы будете видеть то, что происходит. Однако это не столь многофункционально как другие веб-платформы; в прошлый раз я использовал его, не было никакого отслеживания сессии, таким образом, я должен был прокрутить свое собственное. Это также имеет "слишком много волшебного поведения", чтобы заключить Guido в кавычки ("upvars (), вот еще").

Наконец, у Вас есть многофункциональные веб-платформы, такие как Django. Они потребуют, чтобы немного работы стало простым Привет Мировая работа программ, но каждый главный имеет большое, правильно написанное учебное руководство (особенно Django) для обхода Вас через него. Я настоятельно рекомендую использование одной из этих веб-платформ для любого реального проекта из-за удобства и функций и документации, и т.д.

В конечном счете необходимо будет решить то, что Вы предпочитаете. Например, платформы все шаблонные языки использования (специальный код/теги) для генерации файлов HTML. Некоторые из них, такие как шаблоны Гепарда позволяют Вам записать произвольный код Python так, чтобы можно было сделать что-либо в шаблоне. Другие, такие как шаблоны Django более строги и вынуждают Вас разделить свой код представления от Вашей логики программы. Это - все о том, что Вы лично предпочитаете.

Другим примером является обработка URL; некоторые платформы, такие как Django сделали, чтобы Вы определили URL в своем приложении через регулярные выражения. Другие, такие как CherryPy автоматически отображают Ваши функции на URL Вашими именами функций. Снова, это - персональное предпочтение.

я лично использую соединение веб-платформ при помощи CherryPy для моего материала веб-сервера (параметры формы, обработка сессии, отображение URL, и т.д.) и Django для моего объектно-реляционного отображения и шаблонов. Моя рекомендация состоит в том, чтобы запуститься с веб-платформы высокого уровня, проложить себе путь через ее учебное руководство, затем запуститься на маленьком персональном проекте. Я сделал это со всеми технологиями, которые я упомянул, и это было действительно выгодно. В конечном счете Вы получите ощущение того, что Вы предпочитаете и становитесь лучшим веб-программистом (и лучшим программистом в целом) в процессе.

12
ответ дан Eli Courtwright 28 November 2019 в 20:52
поделиться

Если Вы решаете пойти с платформой, которая основана на WSGI (например TurboGears), я рекомендовал бы пройти превосходную статью Другая Самостоятельная Платформа Ian Bicking.

В статье, он создает простую платформу веб-приложений с нуля.

кроме того, проверьте видео Создание веб-платформы с WSGI Kevin Dangoor. Dangoor является основателем проекта TurboGears.

7
ответ дан codeape 28 November 2019 в 20:52
поделиться

Если Вы хотите пойти крупные, выбрать Django, и Вы установлены. Но если Вы хотите только учиться, платформа самокрутки, использующая уже, упомянула WebOb - это может быть действительно забавой, и я уверен, что Вы будете учиться намного больше (плюс Вы, может использовать компоненты, которые Вы любите: шаблонная система, диспетчер URL, слой базы данных, сессии, и caetera).

За прошлые 2 года я создал немного больших сайтов с помощью Django и всего, что я могу сказать, Django заполнит 80% потребностей в 20% времени. Остающиеся 20% работы возьмут 80% времени, неважно, какую платформу Вы использовали бы.

4
ответ дан zgoda 28 November 2019 в 20:52
поделиться

Всегда стоит сделать что-то твердый путь - однажды - как осуществление изучения. Как только Вы понимаете, как это работает, выберите платформу, которая удовлетворяет Вашему приложению, и используйте это. Вы не должны перестраивать колесо, как только Вы понимаете угловую скорость.:-)

также стоит удостовериться, что у Вас есть довольно устойчивое понимание языка программирования позади платформы прежде , Вы вскакиваете - пытающийся изучить и Django и Python одновременно (или Ruby, и направляющие или X и Y), может привести еще к большему количеству беспорядка. Запишите некоторый код на языке сначала, затем добавьте платформу.

Мы учимся разрабатывать, не при помощи инструментов, а путем решения проблем. Столкнутый несколько стен, поднимитесь и найдите некоторые более высокие стены!

3
ответ дан hmason 28 November 2019 в 20:52
поделиться

Если бы Вы никогда не делали никакого CGI, программируя, прежде чем я буду думать, что стоило бы сделать один проект - возможно, просто демонстрационный сайт игры только для себя - использование подхода DIY. Вы узнаете намного больше о том, как вся различная работа частей, чем Вы была бы при помощи платформы. Это поможет в Вас дизайну и отладит и так далее все Ваши будущие веб-приложения однако, Вы пишете им.

Лично я теперь использую Django. Реальная выгода является очень быстрым развертыванием приложения. Объектное реляционное отображение получает вещи, перемещающиеся быстро, и библиотека шаблонов является радостью для использования. Также администраторский интерфейс дает Вам основные экраны CRUD для всех Ваших объектов, таким образом, Вы не должны писать ни один "скучный" материал.

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

2
ответ дан Dave Webb 28 November 2019 в 20:52
поделиться

Хорошо, направляющие на самом деле довольно хорошо, но существует только немного слишком много волшебства, продолжающегося там (от мира Ruby, я очень предпочел бы merb направляющим). Я лично использую Опоры, и довольно проклятый счастливый. Я сказал бы (по сравнению с django), что опоры позволяют Вам обмениваться ints внутренними деталями, легче, чем django. Оборотная сторона - то, что необходимо будет записать большему количеству материала все собой (как основной CRUD).

Профессионалы использования платформы:

  1. получают материал, сделанный быстро (и я имею в виду молнию быстро, как только Вы знаете платформу)
  2. , все - compying к стандартам (которого, вероятно, не настолько легко достигнуть при прокрутке собственного)
  3. легче получить что-то работа (много учебных руководств), не читая огромное количество статей и документов

Недостатки:

  1. Вы изучаете меньше
  2. тяжелее для замены частей (не, так большая часть проблемы в опорах, больше с django)
  3. тяжелее для тонкой настройки некоторого материала низкого уровня (как вышеупомянутое упомянул SQLs)

, От которого можно, вероятно, создать то, что они хороши для:-), Так как Вы получаете весь код, возможно настроить его для установки даже большинству bizzare ситуаций (опоры, предположительно, работают над механизмом приложения Google теперь...).

1
ответ дан Bartosz Radaczyński 28 November 2019 в 20:52
поделиться

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

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

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

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

2
ответ дан 28 November 2019 в 20:52
поделиться

Для небольших проектов довольно легко развернуть собственный. Тем более, что вы можете просто импортировать движок шаблонов, такой как Genshi , и все это будет происходить довольно быстро и легко. Иногда просто использовать отвертку быстрее, чем искать дрель.

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

1
ответ дан 28 November 2019 в 20:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: