URL: https://linuxfr.org/forums/programmation-ruby/posts/fonction-passage-de-r%C3%A9f%C3%A9rence Title: Fonction : passage de référence Authors: Duncan Idaho Date: 2009年07月13日T19:42:43+02:00 Tags: Score: 0 Salut cher forum, j'ai un petit soucis avec Ruby. Je travaille sur des jeux de données relativement volumineux. Je les stocke dans des tables de hachage pour un traitement rapide (j'ai de la RAM tant que je veux) et j'y applique quelques fonctions. Par exemple, j'ai une fonction qui me calcule la mesure de Jaccard entre deux vecteurs. On se fout pas mal de l'implémentation (qui consiste à comparer les éléments identiques et disjoints entre les deux vecteurs: plus il y a d'élément identiques, plus la mesure est élevé, plus il y a d'élément différent, plus la mesure est faible, tout ça entre 0 et 1). Or, quand j'appelle ma fonction, je fais jaccard(vec_1, vec_2) Ce qui prend pas mal de temps, parce que j'ai l'impression (et google confirme, irb aussi) qu'il recopie vec_1 et vec_2 à l'appel de la fonction, que je fais ce calcul environ 180 000 fois (j'ai beaucoup d'éléments à comparer) et que chaque vecteur est de dimension environ 3000. Du coup, la copie prend un peu de temps et plombe pas mal le calcul, déjà bien long (3000 * 180 000). Je cherche donc une façon élégante d'appeler les /références/ à vec_1 et vec_2, puisque de toutes façons je ne modifie pas ces objets dans la fonction. Prenons un cas plus simple. J'ai un tableau a = ["a","b","c"] et une fonction bete : def rend_x (vecteur) £spaces£ £/spaces£vecteur = ["x", "x", "x"] end Je voudrais appeler rend_x(a), et que a soit transformé en ["x", "x", "x"] (c'est-à-dire donc, que ma fonction modifie directement l'élément a -- j'insiste: c'est un exemple jouet, en pratique je m'en fout complètement, je veux juste qu'il ne recopie pas /a/ à l'appel de la fonction). En perl c'est facile (et pour le coup, je réimplémente en ruby un script perl que je trouve bien trop gruik, mais si mon script ruby est beaucoup plus lent -- il l'est -- je vais avoir du mal à le vendre, meme s'il est beaucoup plus propre).