2013-06-04 2 views
2

Я создаю процесс «в реальном времени», который берет данные из файла форматированного OHLCVTBA, отформатированного SierraChart. Код, который считывает данные и создает фрейм данных с использованием генератора, размещен on pastebinPython Pandas global vs pass variable

Я понял, что моя структура (новые данные управляются) ошибочна, и я собираюсь ее реорганизовать. PhE's question and Wes's response взяли меня в направлении заполнения предварительно заполненного DataFrame, который работает хорошо. Мои вопросы здесь:

Быстрее ли держать мои данные и указатели в качестве глобальных переменных или передавать их из различных функций, которые ими пользуются? Кроме того, существуют ли другие соображения, которые должны стимулировать этот выбор?

Спасибо.

ответ

5

Local variables are faster to access than global variables in python.

В контексте панд это означает, что должен передавать переменные в функции, где это имеет смысл (это означает, что их можно быстрее найти внутри функции). И наоборот, вызовы функций в python являются дорогостоящими (если вы вызываете их много), поэтому numpy/pandas, где это возможно, используют векторизованные функции. Очевидно, что вы должны быть осторожны, чтобы все ваши вычисления выполнялись на месте, если вы делаете что-то внутри функции.

Обычно я обычно начинаю работать в «pythonic»/«pandastic», прежде чем беспокоиться о скорости. Затем используйте %timeit и посмотрите, достаточно ли он уже достаточно (обычно это так). Добавьте unittest (s). Tweak для скорости, %timeit,% prun и %timeit еще. Если это большой проект vbench.

+0

Это замечательно, но не учитывает прохождение многих переменных (но, конечно, профилирование будет). – Elazar

+0

@ Элазар, это правда ... иначе вы можете стрелять в темноту :) (а не стремиться к самым медленным вещам.) –

+0

Спасибо Энди. Я преобразовал свой код в форму класса и добавлю факультативный журнал основного процесса, чтобы подтвердить, что процессы работают в момент времени данных. [Это обновленная версия] (http://pastebin.com/Gyy6MNu3) Классы делают его более понятным и простым в обслуживании, поэтому будет интересно проверить время, когда я дойду до этого этапа. –

2

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

(EDIT: в любом случае см. Ссылку @Andy Hayden об их относительном времени доступа и ссылку here, в которой говорится, что локальные переменные намного быстрее).

Основное соображение заключается в том, что «разработка программного обеспечения» - использование глобальных данных - это bad idea, так как трудно следовать, когда и где оно изменяется. Конечно, если вы не можете выполнить требования (runtime) в противном случае, тогда это нужно сделать; но для того, чтобы это знать - мер первый.

В любом случае, я бы порекомендовал другое решение - сохраните эти данные внутри класса. Это будет стоить еще одного словарного поиска (первый поиск - это имя переменной, и это происходит в любом случае, второе - поиск в классе dict), но он может быть более эффективным, чем прохождение вокруг многих объектов, и поможет организовать вашей программы.

+0

Спасибо за ответ. ОК. Я создам простую версию 1000x и профилю ее с помощью iPython. --- Что касается класса - если я настроил его в классе (классах), включая DF, указатели и т. Д., Не будет ли у меня все те же накладные расходы, но более красивая ориентированная по осям структура (что может быть достаточной причиной сделать это)? –

+0

Это будет как один объект, пройденный вокруг, а не многие (если это ваша проблема). и да, это будет стоить два словарных поиска вместо одного. – Elazar

+0

Протестировано: оно добавило 61 нс к процессу или 0,2% к этим коротким функциям , так что это незначительно. http://i.imgur.com/Hzx4zwX.png –