Почему бы не всегда использовать psyco для кода Python?

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

Для каждого использования шаблона в его собственном файле заголовка (сгенерированном из модели UML) имеется typedef, , Его тело содержит экземпляр (который заканчивается в библиотеке, которая связана в конце). Каждый пользователь шаблона включает этот файл заголовка и использует typedef.

Схематический пример:

MyTemplate.h:

#ifndef MyTemplate_h
#define MyTemplate_h 1

template <class T>
class MyTemplate
{
public:
  MyTemplate(const T& rt);
  void dump();
  T t;
};

#endif

MyTemplate.cpp:

#include "MyTemplate.h"
#include <iostream>

template <class T>
MyTemplate<T>::MyTemplate(const T& rt)
: t(rt)
{
}

template <class T>
void MyTemplate<T>::dump()
{
  cerr << t << endl;
}

MyInstantiatedTemplate.h:

#ifndef MyInstantiatedTemplate_h
#define MyInstantiatedTemplate_h 1
#include "MyTemplate.h"

typedef MyTemplate< int > MyInstantiatedTemplate;

#endif

MyInstantiatedTemplate.cpp:

#include "MyTemplate.cpp"

template class MyTemplate< int >;

main.cpp:

#include "MyInstantiatedTemplate.h"

int main()
{
  MyInstantiatedTemplate m(100);
  m.dump();
  return 0;
}

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

41
задан Eli Bendersky 22 February 2009 в 18:43
поделиться

7 ответов

1) Накладные расходы на память являются основными, как описано в других ответах. Вы также оплачиваете стоимость компиляции, которая может быть непомерно высокой, если вы не будете избирательны. Из справочника пользователя :

Компиляция всего часто бывает излишней для приложений среднего или большого размера. Недостатки слишком большой компиляции заключаются во времени, затрачиваемом на компиляцию, плюс объем памяти, который потребляет этот процесс. Это тонкий баланс, который нужно поддерживать.

2) Компиляция Psyco может действительно повредить производительности. Снова из руководства пользователя ( раздел «известные ошибки» ):

Также есть ошибки производительности: ситуации, в которых Psyco замедляет код, а не ускоряет его. Сложно составить полный список возможных причин, но вот несколько общих:

  • Встроенные функции map и filter следует избегать и заменять на понимание списка. Например, map (lambda x: x * x, lst) следует заменить более читаемым, но более новым синтаксисом [x * x for x in lst] .
  • Компиляция регулярных выражений, похоже, не приносит пользы от Psyco. (Это не влияет на выполнение регулярных выражений, поскольку это код на языке C.) Не включайте Psyco в этом модуле; при необходимости отключите его явно, например, вызвав psyco.cannotcompile (re.compile) .

3) Наконец, есть несколько относительно неясных ситуаций, когда использование Psyco действительно приводит к появлению ошибок. Некоторые из них перечислены здесь .

22
ответ дан 27 November 2019 в 00:52
поделиться

Вполне просто: "Поскольку код уже работает достаточно быстро".

1
ответ дан Ali Afshar 23 February 2009 в 04:43
поделиться

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

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

4
ответ дан MrTopf 23 February 2009 в 04:43
поделиться

Psyco в настоящее время использует большую память. Это только работает на Intel совместимые с 386 процессоры (под любой ОС) прямо сейчас. Существуют некоторые тонкие семантические различия (т.е. ошибки) со способом, которым работает Python; они не должны быть очевидными в большинстве программ.

См. также эти раздел протестов . Для трудного примера я заметил, что мое веб-приложение со сгенерированными Гепардом шаблонами и DB ввод-вывод не получило заметного ускорения.

6
ответ дан HUAGHAGUAH 23 February 2009 в 04:43
поделиться

Никогда не нужно полагаться на некоторое чудодейственное средство для решения проблем. Используя психо для создания медленной программы быстрее обычно не необходимо. Плохие алгоритмы могут быть переписаны, и части, которые требуют , скорость могла быть записана на другом языке. Конечно, Ваш вопрос спрашивает, почему мы не используем его для повышения скорости так или иначе, и существует немного служебное, когда Вы используете психо. Psyco использует память и те две строки просто вид чувство как издержки при рассмотрении их. Что касается моих личных мотивов на том, почему я не использую психо, это - потому что это не поддерживает x86_64, который я рассматриваю как новое и ближайшую архитектуру (особенно с 2038, приближаясь рано или поздно). Моя альтернатива является pypy, но я не совсем люблю это также.

3
ответ дан Andrew Szeto 23 February 2009 в 04:43
поделиться
  • 1
    attachment то, что Вы установили в has_attached_file :attachment, – B Seven 4 December 2012 в 16:03

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

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

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

5
ответ дан Devin Jeanpierre 23 February 2009 в 04:43
поделиться

Несколько других вещей:

  1. Это, кажется, очень активно не сохраняется.
  2. Это может быть пожиратель ресурсов памяти.
2
ответ дан Jason Baker 23 February 2009 в 04:43
поделиться
  • 1
    @BSeven Вы думаете, что было бы более ясно, добавил ли я это к ответу? Если так, I' ll добавляют его. – theIV 5 December 2012 в 03:06
Другие вопросы по тегам:

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