Лучше используйте кортеж или массив numpy для хранения координат

Я портирую C++ научное приложение на Python, и поскольку я плохо знаком с Python, некоторые проблемы возникают по моему мнению:

1) Я определяю класс, который будет содержать координаты (x, y). К этим значениям будут несколько раз получать доступ, но они только будут считаны после инстанцирования класса. Лучше использовать кортеж или массив numpy, и в памяти и мудрое время доступа?

2) В некоторых случаях эти координаты будут использоваться для создания комплексного числа, оцененного на комплексной функции, и действительная часть этой функции будет использоваться. Предположение, что нет никакого способа разделить реальные и сложные части этой функции и действительную часть, должно будет использоваться на конце, возможно, лучше для использования непосредственно комплексных чисел для хранения (x, y)? Как плохо издержки с преобразованием от комплекса до реального в Python? Код в C++ делает много этих преобразований, и это - большое замедление в том коде.

3) Также некоторые преобразования координат должны будут быть выполнены, и для координат к значениям X и Y получат доступ в отдельном, преобразование быть сделанными, и возвращенный результат. Координатные преобразования определяются в комплексной плоскости, так еще быстрее для использования X и Y компонентов непосредственно, чем доверие комплексным переменным?

Спасибо

9
задан Ivan 1 April 2010 в 21:17
поделиться

2 ответа

С точки зрения потребления памяти массивы numpy более компактны, чем кортежи Python. Массив numpy использует один непрерывный блок памяти. Все элементы массива numpy должны иметь объявленный тип (например, 32-битное или 64-битное число с плавающей запятой). Кортеж Python не обязательно использует непрерывный блок памяти, и элементы кортежа могут быть произвольными объектами Python, которые обычно потребляют больше памяти, чем числовые типы numpy.

Таким образом, эта проблема - явная победа для numpy (при условии, что элементы массива могут быть сохранены как числовой тип numpy).

Что касается скорости, я думаю, что выбор сводится к вопросу: «Можете ли вы векторизовать свой код?»

То есть можете ли вы выразить свои вычисления как операции, выполняемые над целыми массивами поэлементно.

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

Примером кода, который невозможно векторизовать, может быть случай, если в ваших расчетах рассматривается, скажем, первое комплексное число в массиве z , и выполняется вычисление, которое дает целочисленный индекс idx , затем получение z [idx] , вычисление этого числа, что дает следующий индекс idx2 , затем получение z [idx2] , и т.д. Этот тип вычислений не может быть векторизован. В этом случае вы также можете использовать кортежи Python, поскольку вы не сможете использовать силу numpy.

Я бы не стал беспокоиться о скорости доступа к действительной / мнимой части комплексного числа. Я предполагаю, что проблема векторизации, скорее всего, определит, какой метод быстрее. (Хотя, кстати, numpy может преобразовывать массив комплексных чисел в их реальные части, просто проходя по сложному массиву, пропуская все остальные числа с плавающей запятой и просматривая результат как числа с плавающей запятой. Более того, синтаксис чрезвычайно прост: If z - это комплексный массив numpy, затем z.real - это реальные части в виде массива чисел с плавающей запятой. Это должно быть намного быстрее, чем чистый Python подход с использованием понимания списка атрибутов поиска: [z.real for z in zlist] .)

Просто из любопытства, какова ваша причина для переноса код C ++ для Python?

6
ответ дан 4 December 2019 в 21:49
поделиться

Массив numpy с дополнительным измерением потребляет меньше памяти и, по крайней мере, так же быстро !, как массив numpy массив кортежей; комплексные числа не хуже или даже лучше, в том числе и для вашего третьего вопроса. Кстати, вы, возможно, заметили, что - хотя вопросы, заданные позже вашего, получали множество ответов, - вы не работали: отчасти причина, без сомнения, в том, что задание трех вопросов в вопросе отключает респондентов. Почему бы просто не задавать по одному вопросу на вопрос? Знаете, это не значит, что с вас взимают плату за вопросы или что-то в этом роде ...! -)

3
ответ дан 4 December 2019 в 21:49
поделиться
Другие вопросы по тегам:

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