W moim kodzie używam numpy tablic do interfejsu między metodami i klasami. Optymalizując główne części mojego programu Używam cytonu z c wskaźnikami tych numpy tablic. Niestety, sposób, w jaki obecnie deklaruję tablice, jest dość długi.Zgłaszanie numpy array i wskaźnika c w cython
Na przykład, powiedzmy, że mam metodę, która powinna zwrócić tablicę numpy someArrayNumpy, ale wewnątrz wskaźników funkcji * niektóreArrayPointers powinny być używane do prędkości. Jest to, jak zwykle deklarują to:
cdef:
numpy.ndarray someArrayNumpy = numpy.zeros(someArraySize)
numpy.ndarray[numpy.double_t, ndim=1] someArrayBuff = someArrayNumpy
double *someArrayPointers = <double *> someArrayBuff.data
[... some Code ...]
return someArrayNumpy
Jak widać, to zajmuje 3 linii kodu na zasadzie jednej tablicy, a często muszę deklarować więcej z tych tablic.
Czy istnieje bardziej kompaktowy/sprytny sposób na zrobienie tego? Chyba coś mi brakuje.
EDIT:
Więc dlatego, że został poproszony przez J. Martinot-Lagarde I planowane wskaźniki C i "NumPy wskazówek". Kod był w zasadzie
for ii in range(someArraySize):
someArrayPointers[ii] += 1
i
for ii in range(someArraySize):
someArrayBuff[ii] += 1
z definicjami z powyżej, ale dodałem "ndim = 1, tryb = 'c'" tylko upewnić. Wyniki są dla someArraySize = 1E8 (czas w ms):
testMartinot("cPointers")
531.276941299
testMartinot("numpyPointers")
498.730182648
To właśnie mniej więcej pamiętam z poprzednich/inny punkt odniesienia.
Jeśli ktokolwiek czyta to: Do tej pory zacząłem używać maszynopisu z cytonami. Z mojego doświadczenia wynika, że są one bardzo zbliżone do wskaźników C w zakresie wydajności (bliżej niż do bufora numpy) i znacznie łatwiejsze w użyciu. Rzeczywiście, w rzadkich przypadkach robiłem "małe" (a więc niełatwe do rozpoznania/możliwe do uniknięcia) pomyłki przy pomocy wskaźników C, które czyniły je wolniejszymi niż typowane widoki pamięci. Naprawdę polecam wpisane widoki pamięci, jeśli i gdzie to możliwe. – oli