2015-01-28 14 views
8

desidero aggiungere (aritmetica) due grandi System.Array s elemento saggio IronPython e memorizzare il risultato nel primo array come questo:modo più veloce per applicare operazioni aritmetiche System.Array in IronPython

for i in range(0:ArrA.Count) : 
     arrA.SetValue(i, arrA.GetValue(i) + arrB.GetValue(i)); 

Tuttavia, questo sembra molto lento. Avere uno sfondo C Mi piacerebbe usare puntatori o iteratori. Tuttavia, non so come applicare l'idioma IronPython in modo rapido. Non posso usare gli elenchi Python, poiché i miei oggetti sono rigorosamente di tipo System.Array. Il tipo è 3d float.

Quali sono i fastidi/un modo veloce per eseguire questo calcolo?

Edit:

  • Il numero di elementi è appr. 256^3.
  • float 3D significa che è possibile accedere alla matrice in questo modo: array.GetValue (indexX, indexY, indexZ). Non sono sicuro di come sia organizzata la rispettiva memoria in System.Array di IronPython.
  • Sfondo: Ho scritto un'interfaccia per un'API IronPython, che consente l'accesso ai dati in uno strumento software di simulazione. Recupero i dati scalari 3d e li accumulo in un array temporale nel mio script IronPython. L'accumulo viene eseguito 10.000 volte e dovrebbe essere veloce, in modo che la simulazione non duri.
+0

Potrebbe fornire più contesto? Galleggiante 3d? Una struttura? Qual è l'operazione effettiva? 3 aggiunge? Quanti elementi è grande? Quanto spesso si verifica l'operazione? –

+0

Contesto extra fornito. –

risposta

0

È possibile utilizzare la libreria numpy sviluppata per IronPython?

https://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net

Sembra da sostenere, e per quanto ne so è il più vicino si può ottenere in pitone alla funzionalità puntatore stile C con gli array e così via.

creare una matrice:

x = np.array([[1, 2, 3], [4, 5, 6]], np.int32) 

moltiplicare tutti gli elementi da 3,0:

x *= 3.0 
+0

Sfortunatamente, poiché sto interagendo con un'API, non posso andare via da System.Array. Convertire in Numpy per primo non lo renderebbe più veloce, davvero? –

+0

Puoi provare i metodi di accesso generici IE per i in range (0: ArrA.Count): arrA [i] = arrA [i] + arrB [i] '? Confrontare anche con la conversione completa in numpy, quindi tornare alla matrice. Chissà? :) – beiller

+0

I metodi di accesso generici non funzionano sugli array 3D. Per quanto ne so, per la conversione in Numpy devo fare lo stesso (ciclo costoso del tempo) come mostrato nella mia domanda. –