линейные комбинации в python / numpy - PullRequest
2 голосов
/ 30 мая 2010

привет

Я не уверен, тупой ли это вопрос или нет.

Допустим, у меня есть 3 массива, A1, A2, A3 и 3 числа с плавающей точкой, c1, c2, c3

и я бы хотел оценить B = A1 * c1 + A2 * c2 + A3 * c3

будет вычислять numpy как, например,

 E1 = A1*c1
 E2 = A2*c2
 E3 = A3*c3
 D1 = E1+E2
 B = D1+E3

или это умнее? В C ++ у меня был отличный способ абстрагировать этот вид операции.

Я определил ряд общих шаблонных функций 'LC', LC для линейной комбинации, например:

template<class T,class D>
void LC( T & R,
    T & L0,D C0,
    T & L1,D C1,
    T & L2,D C2)
{
    R = L0*C0
        +L1*C1
        +L2*C2;        
}

и затем специализировал это для различных типов,

так, например, для массива код выглядел как

for (int i=0; i<L0.length; i++)
    R.array[i] =
    L0.array[i]*C0 +
    L1.array[i]*C1 +
    L2.array[i]*C2;

, таким образом, избегая необходимости создавать новые промежуточные массивы.

Это может выглядеть грязно, но сработало очень хорошо.

Я мог бы сделать что-то подобное в python, но я не уверен, что это необходимо.

Заранее спасибо за понимание. -nick

Ответы [ 2 ]

6 голосов
/ 30 мая 2010

Хотя numpy теоретически может в любое время всегда модернизировать свои внутренние компоненты для выполнения чудесных оптимизаций, в настоящее время это не так: B = A1*c1 + A2*c2 + A3*c3 действительно создаст, а затем откажется от промежуточных временных массивов («тратя» некоторые вспомогательные средствапамять, конечно - больше ничего).

B = A1 * c1, за которым следует B += A2 * c2; B += A3 * c3, опять же в это время , поэтому вы не будете тратить часть этой временной памяти.

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

2 голосов
/ 30 мая 2010

Это идея цифра (быстрый анализатор числовых массивов для Python и NumPy). Вы можете попробовать этот пакет перед компиляцией своих собственных подпрограмм.

...