2013-03-31 2 views
1

Я работаю над теоретической теоретической проблемой теории, которая включает в себя объединение комбинаций гиперэдров в гиперграфе для анализа различных случаев.с использованием cython или PyPy для оптимизации кортежей/списков (алгоритм теории графов, реализованный в python)

Я реализовал первоначальную версию основного алгоритма в Python, но из-за его комбинаторной структуры (и, вероятно, моей реализации) алгоритм довольно медленный.

Один из способов, с помощью которого я рассматриваю возможность его ускорения - использовать PyPy или Cython.

Глядя на документацию, похоже, Cython не предлагает отличного ускорения, когда дело доходит до кортежей. Это может быть проблематично для реализации, поскольку я представляю гиперссылки как кортежи - поэтому большинство алгоритмов манипулирует кортежами (однако они имеют одинаковую длину, вокруг len 6 каждый).

Поскольку мои умения на C и Python довольно минимальны, я был бы признателен, если бы кто-нибудь мог посоветовать, что было бы лучшим способом для оптимизации кода, учитывая его зависимость от кортежей/списков. Есть ли документация с использованием списков/кортежей с Cython (или PyPy)?

+0

Можете ли вы разместить свой код и выделить части, которые медленны? Трудно предложить улучшения, не видя кода, так как проблема может быть не такой, как вы думаете. В _general_ лучшим ответом на улучшение скорости является мысль о лучшем алгоритме ... –

+0

Cython может работать с C-массивами и структурами и позволяет вам определять типы расширений. Любой из них может быть альтернативой кортежам. –

+0

@Roland, алгоритм - это фактически NP (он связан с сопоставлением в гиперграфах), поэтому я не могу рассчитывать на более оптимальный алгоритм, чем тот, который я уже реализовал. Однако меня интересует только конкретный случай. Я оцениваю время выполнения своей наивной реализации в Python, если я могу заставить его работать в 100 раз быстрее, чем это закончится за приемлемое время (около 2 недель). – nsimplex

ответ

1

, что было бы лучшим способом, чтобы продолжить в оптимизации кода ...

Profile first. Существует стандартный модуль cProfile, который очень просто профилирует. Оптимизация кода перед профилированием совершенно бессмысленна.

Кроме того, для графиков вы можете попробовать использовать отличный модуль networkx. Кроме того, если вы имеете дело с длинными отсортированными списками, вы можете взглянуть на модули bisect и heapq.

+0

Спасибо Jakub. профилировщик полезен, я его запускал раньше, используя его, я считаю, что мне нужно сделать функцию на 100 раз быстрее, чтобы завершить код в приемлемое время для моей цели. Я также посмотрел на пакеты теории графов, которые вы упомянули, и действительно они превосходны. Однако я не использовал их, потому что в терминах алгоритмов теории графов мне нужно было только совпадение в гиперграфах, и я должен был реализовать его определенным образом, чтобы иметь возможность использовать несколько ярлыков. – nsimplex

1

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

Постоянная часть - вот что важно здесь - если сложность алгоритма вырастает, скажем, 2^n (что типично для наивного алгоритма), то добавление дополнительного узла в граф удваивает ваше время. Это означает, что 10 узлов добавляют 1024 времени, 20 узлов 1024 * 1024 и т. Д. Если вам повезло, PyPy может ускорить ваш алгоритм на 100x, но это остается постоянным по размеру графика (и вы быстро исчерпаете вселенную время так или иначе).

+0

Спасибо, fjal. Действительно, все, что мне нужно, - это 100-кратное ускорение. Мой вопрос решается до того, что вы поднимаете данные о типах данных. Как объявить кортежи python в C, чтобы получить максимальное ускорение. И примеры того, как это сделать, будут высоко оценены. – nsimplex

+0

Вы путаете вещи. Много. Просто используйте PyPy. PyPy не похож на Cython - вам не нужно ничего определять, он должен просто работать. – fijal

 Смежные вопросы

  • Нет связанных вопросов^_^