Я хорошо провожу время, изучая Python путем записи генетического типа программирования приложения.
У меня был некоторый большой совет от Torsten Marek, Paul Hankin и Alex Martelli на этом сайте.
Программа имеет 4 основных функции:
Поскольку весь из генерирует, скрещивает и видоизменяется, вызов 'оценивают фитнес'. это - самая занятая функция и является основным узким местом speedwise.
Как природа генетических алгоритмов, она должна искать огромное пространство решения так быстрее лучше. Я хочу ускорить каждую из этих функций. Я запущу со средства анализа фитнеса. Мой вопрос - то, что является лучшим способом сделать это. Я изучал цитон, ctypes и 'связывал и встраивал'. Они все плохо мне знакомы и вполне вне меня в данный момент, но я надеюсь учиться один и в конечном счете все они.
'Функция фитнеса' должна сравнить значение дерева выражений к значению целевого выражения. Таким образом, это будет состоять из постфиксного средства анализа, которое считает дерево в постфиксном порядке. У меня есть весь код в Python.
Мне нужен совет, на котором я должен изучить и использовать теперь: цитон, ctypes или соединение и встраивание.
Спасибо.
Пока игнорируйте ответы всех остальных. Первое, что вам следует научиться использовать, - это профилировщик. 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.
Еще один отличный вариант - boost :: python, который позволяет легко оборачивать C или C ++.
Из этих возможностей, поскольку у вас уже написан код Python, лучше всего сначала попробовать cython. Возможно, вам не придется переписывать какой-либо код, чтобы получить ускорение.
Попробуйте настроить фитнес-функцию так, чтобы она поддерживала запоминание. Это заменит все вызовы, дублирующие предыдущие, с помощью быстрого поиска по словарю.
Cython быстрее всего выполняет работу, либо путем написания вашего алгоритма непосредственно в Cython, либо путем написания его на C и привязки его к python с помощью Cython .
Мой совет: изучите Cython.