Мне нужно ускорить функцию. Должен ли я использовать cython, ctypes или что-то еще? - PullRequest
6 голосов
/ 15 апреля 2010

Мне очень нравится изучать Python, написав приложение типа генетического программирования.

На этом сайте я получил несколько замечательных советов от Торстена Марека, Пола Ханкина и Алекса Мартелли.

Программа имеет 4 основные функции:

  • генерирует (случайным образом) дерево выражений.
  • Оцените пригодность дерева
  • метис
  • мутировать

Как и все генерация, скрещивание и мутация вызова «оценить пригодность». это самая загруженная функция и является основным узким местом по скорости.

Как и характер генетических алгоритмов, он должен искать огромное пространство решений, поэтому чем быстрее, тем лучше. Я хочу ускорить каждую из этих функций. Начну с оценщика фитнеса. Мой вопрос в том, что является лучшим способом сделать это. Я изучал cython, ctypes и «связывание и встраивание». Все они для меня в новинку и в настоящее время находятся за пределами моего понимания, но я с нетерпением жду, чтобы изучить один и, в конечном итоге, всех их.

«Фитнес-функция» должна сравнивать значение дерева выражений со значением целевого выражения. Так что он будет состоять из постфиксного оценщика, который будет читать дерево в постфиксном порядке. У меня есть весь код на Python.

Мне нужен совет, который я должен изучить и использовать сейчас: cython, ctypes или компоновка и встраивание.

Спасибо.

Ответы [ 4 ]

13 голосов
/ 15 апреля 2010

Проигнорируйте ответ всех остальных на данный момент.Первое, что вы должны научиться использовать это профилировщик.Python поставляется с профилем / cProfile;Вы должны научиться читать результаты и анализировать, где находятся настоящие узкие места.Задача оптимизации состоит из трех частей: сократить время, затрачиваемое на каждый вызов, сократить количество вызовов, которые необходимо выполнить, и уменьшить использование памяти для уменьшения перегрузки диска.

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

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

Если вы выполнили все вышеперечисленное и у вас все еще есть проблемы с производительностью, и вы работаете на платформе x86 (в основном с большинством процессоров), тогда начните смотретьПсихо.Psyco может оптимизировать код Python с необходимостью вообще изменить ваш код Python.

Если вы много занимаетесь обработкой чисел и массивов, вам следует взглянуть на Numpy / Scipy и сторонние модули gmpy.,

Следующая попытка - Cython.Cython - это немного другой язык, чем Python, фактически Cython на самом деле является Си с синтаксисом Python.

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

3 голосов
/ 15 апреля 2010

Cython является самым быстрым для выполнения работы, либо написав свой алгоритм непосредственно на Cython, либо написав его на C и связав его с python с помощью Cython.

Мой совет: учите Cython.

0 голосов
/ 16 апреля 2010

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

0 голосов
/ 15 апреля 2010

Еще одна отличная опция - Boost :: Python, которая позволяет легко переносить C или C ++.

Из этих возможностей, тем не менее, поскольку у вас уже написан код на Python, вероятно, стоит сначала попробовать Cython. Возможно, вам не придется переписывать какой-либо код для ускорения.

...