Я должен ускорить функцию. Я должен использовать цитон, ctypes, или что-то еще?

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

У меня был некоторый большой совет от Torsten Marek, Paul Hankin и Alex Martelli на этом сайте.

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

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

Поскольку весь из генерирует, скрещивает и видоизменяется, вызов 'оценивают фитнес'. это - самая занятая функция и является основным узким местом speedwise.

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

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

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

Спасибо.

7
задан ebo 15 April 2010 в 16:30
поделиться

4 ответа

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

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

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

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

Еще одна вещь, которую вы хотите попробовать, - это PyPy. PyPy может перекомпилировать JIT и выполнять гораздо более продвинутую оптимизацию, чем CPython, и он будет работать без необходимости изменять ваш код Python. Хотя хорошо оптимизированный код, ориентированный на CPython, может сильно отличаться от хорошо оптимизированного кода, ориентированного на PyPy.

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

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

15
ответ дан 6 December 2019 в 10:48
поделиться

Еще один отличный вариант - boost :: python, который позволяет легко оборачивать C или C ++.

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

0
ответ дан 6 December 2019 в 10:48
поделиться

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

0
ответ дан 6 December 2019 в 10:48
поделиться

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

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

3
ответ дан 6 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

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