2010-01-19 2 views
3

В игре, которую я пишу, я использую класс 2D-векторов, который я написал для обработки скоростей объектов. Это называется большим количеством раз в каждом кадре, так как на экране много объектов, поэтому любое увеличение, которое я могу сделать на его скорости, будет полезно.Когда он имеет смысл переписать модуль Python в C?

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

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

ответ

14

Если вы используете векторный инструмент, дайте numpy попробуйте сначала. Скорее всего, вы получите скорость недалеко от C, если вы используете функции векторной манипуляции numpy с умом.

Кроме этого, ваш вопрос очень эвристичен. Если ваш код слишком медленно:

  1. Профиль это - скорее всего, вы будете в состоянии улучшить его в Python
  2. Используйте правильные оптимизированные C на основе библиотеки (NumPy в вашем случае)
  3. Try psyco
  4. TRY переписывания части с cython
  5. Если все остальное терпит неудачу, переписать в C
+0

Это ... что? –

+0

@ Доминичный, отредактированный. Thanks –

9

Первая мера затем оптимизировать

+5

Аминь. Оптимизация без контрольных показателей - это просто вуду. Проектирование с помощью voodoo приводит к плохому программному обеспечению. Тем не менее, разработка некоторой интуиции о том, где ориентироваться, важна, и это то, о чем спрашивает этот вопрос. –

+0

Да, я предположил, что другие люди с более личным опытом будут взвешивать с помощью numpy, boost: python, cython и т. Д. Я просто думал, что буду забивать домашнюю точку –

+0

-1 «Скорее всего, вы получите скорость недалеко от C, если вы используете функции векторной манипуляции numpy разумно ». Где «недалеко» на самом деле означает: «даже близко, но что-то удовлетворительное». –

0

Хороший профайлер, который я использую в Linux, - pycallgraph. Однако по мере увеличения вашей программы он начинает создавать гораздо более крупные изображения, которые сложнее отслеживать. Однако я уверен, что вы можете исключить модули.

0

Общая мудрость - это «профиль», «мерка» и т. Д. Ну, может быть. Просто войдите в отладчик и возьмите 10 stackshots. Если более чем один из них заканчивается в вашем коде оболочки, тогда он стоит примерно на 10%, поэтому вам следует подумать о повторном выполнении этого в C, чтобы сохранить это время. Скорее всего, вы найдете другие вещи, которые стоят больше, чем это.

1

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

  • ваших умные оптимизации на самом деле может вызвать замедление
  • оптимизировать то, что занимает 1% от общего времени выполнения никогда не даст вам производительность более 1%

общий подход:

  1. своего кода
  2. определить горячую точку
  3. время этой точки доступа
  4. оптимизирует это
  5. времени горячей точки снова увидеть, если это быстрее. Если это не было 3.

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

Для профилирования кода python под Linux вы можете использовать pyprof2calltree, который работает в сочетании с kcachegrind и является абсолютно потрясающим.

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