• # Liste des fonctions de numpy supportées

    Posté par . En réponse au journal Pythran, en plein délire. Évalué à 4.

    S'il faut choisir entre numba et pythran, je pense que le choix pour moi se fera sur le support du sous ensemble de numpy.

    Celui de numba est extrêmement faible, ce qui rend le port de code que l'on a voulu par trop lent (donc on utilise plein d'outils numpy) extrêmement chiant.

    Je ne trouve pas une page explicite qui liste les fonction numpy supportées, c'est dommage !

    Par exemple serait il possible de compiler ce bout de code ?

    import numpy as np
    def get(img, y0, y1, x0, x1, mode="reflect"):
     xs, ys = np.mgrid[y0:y1, x0:x1]
     height, width = img.shape
     if mode == "nearest":
     xs = np.clip(xs, 0, height-1)
     ys = np.clip(ys, 0, width-1)
     elif mode == "wrap":
     xs = xs % height
     ys = ys % width
     elif mode == "reflect":
     maxh = height-1
     maxw = width-1
     # An unobvious way of performing reflecting modulo
     # You should comment this
     xs = np.absolute((xs + maxh) % (2 * maxh) - maxh)
     ys = np.absolute((ys + maxw) % (2 * maxw) - maxw)
     elif mode == "constant":
     output = np.empty((y1-y0, x1-x0))
     output.fill(0) # WHAT THE CONSTANT IS
     # LOADS of bounds checks and restrictions
     # You should comment this
     target_section = output[max(0, -y0):min(y1-y0, -y0+height), max(0, -x0):min(x1-x0, -x0+width)]
     new_fill = img[max(0, y0):min(height, y1), max(0, x0):min(width, x1)]
     # Crop both the sections, so that they're both the size of the smallest
     # Use more lines; I'm too lazy right now
     target_section[:new_fill.shape[0], :new_fill.shape[1]] = new_fill[:target_section.shape[0], :target_section.shape[1]]
     return output
     else:
     raise NotImplementedError("Unknown mode")
     return img[xs, ys]

    En soit, je ne suis pas sur de gagner en perf, mais comme j'appelle ce code dans plein de filtres, je ne peux pas utiliser numba par exemple si je fais appel à cette fonction.

    Personnellement mon intérêt réside dans ne pas avoir à vectoriser des boucles avec plein de conditions sur les indices d'un tableau ...

    La c'est la version 2D pour jouer mais ne 3D, ce n'est même pas la peine.

    Et si je le fais en cython, alors j'ai perdu tout le monde ... et je dois tout gérer !

    Donc une solution ou je serais directement capable en lisant une page de choisir de réduire mes appels au sous ensemble supporté serait cool. C'est juste que sans la page du support, c'est assez difficile.

    Après, c'est peut être mois que n'ai juste pas cherché où il faut, cela ne serait pas la première fois ...