J'écris un script Perl dans lequel j'ai besoin de boucler sur chaque caractère d'une chaîne. Il y a beaucoup de chaînes et chacun coûte 100 caractères (ce sont des séquences d'ADN courtes, au cas où vous vous demandez). P>
Alors, est-il plus rapide d'utiliser Pendant que j'attends une réponse, je suppose que je vais aller lire sur la façon de comparer les choses à Perl. P> substr code> pour extraire chaque caractère un à la fois, ou est-il plus rapide de
divisé code> la chaîne dans un tableau, puis itérale sur le tableau? p>
3 Réponses :
Voici ce que je ferais au lieu d'essayer d'essayer de choisir entre Ma curiosité a eu le meilleur de moi. Voici un indice de référence: p> sortie: p> substr code> et
split code>:
mise à jour: h3 >
Je me sens comme un nerd pour avoir visionné cette réponse comme une lettre d'amour pour Perl (TMTOWTDI). :)
Cela dépend vraiment de ce que vous faites avec vos données - mais hé, vous dirigez la bonne façon avec votre dernière question! Ne devinez pas, référence.
Perl fournit le Benchmark module pour exactement ce genre de chose et l'utiliser est vraiment assez simple. Voici un petit exemple de code pour commencer avec: p> et un résultat d'échantillon: p> est surprenant que le substrateur est étonnamment vite. :) p> p>
Oui, mon indice de référence montre également que le sous-traitant est le gagnant après 1 million de manières de chaque méthode. En tant que bonus, j'ai eu des tâches ménagères effectuées pendant qu'il courait.
N'OUBLIEZ pas VEC code>:
$ hist {$ _} {Vec $ ADN, $ _, 8} ++ pour 0. $ Longueur code> => -3% de
substraire code> dans mon repère.
Fait intéressant, Déballez 'c *' code> est effectivement plus lent que
divisé code> (-15% que
substr code>) - Je me demande pourquoi.
J'ai un exemple dans Mastering Perl em> traiter avec ce problème. Voulez-vous créer un groupe de stagiaires individuels, chacun qui porte autour de la mémoire de mémoire d'un scalaire Perl ou stockez tout dans une seule chaîne pour réduire la mémoire, mais peut-être faire plus de travail. Vous dites que vous en avez beaucoup, alors laissez-les alors que des chaînes simples pourraient travailler beaucoup mieux pour vous si vous êtes inquiet pour la mémoire. P>
Mastering Perl EM> a également quelques chapitres traitant de l'analyse comparative et du profilage, si vous êtes curieux de celles-ci. P>
Ether dit de l'obtenir d'abord et de vous soucier du reste plus tard. Une partie de cela est de cacher les opérations derrière une interface orientée vers une tâche. Un joli module orienté objet peut le faire pour vous. Si vous n'aimez pas l'implication, vous le modifiez. Cependant, les programmes au niveau supérieur n'ont pas à changer car l'interface reste la même. P>
Les scripts de référence plus ou moins ont eu la bonne idée de la façon dont j'ai besoin d'utiliser les personnages: en tant que indices dans un hachage. J'ai écrit mon propre script de référence, mais tout le monde me frappe ici. J'ai eu les mêmes résultats. La mémoire n'est pas un problème car je traite les cordes une à la fois et que chacun n'est que 100 caractères.
Qu'est-ce que vous essayez de faire exactement? Donnez un exemple de ce que vous voulez faire avec les personnages. Habituellement, il existe de meilleurs moyens de faire des choses que
substr code> ou
divisée code>. Aussi, voir perdoc.perl.org/benchmark.html
Ma réponse à la branche va être "ça n'a pas d'importance" - Obtenez votre script d'abord travailler, puis réfléchissez à l'optimisation. Au moins initialement, la méthode "la plus rapide" est celle qui est la plus facile à écrire sans bugs.
Je me soucierai généralement de l'optimiser cela, mais je dois traiter environ 400 000 000 séquences. Je compose essentiellement la distribution de caractères à chaque position, donc j'ai vraiment besoin des caractères individuels.
+1 pour lire sur la façon de comparer cela. Lequel est plus rapide risque de dépendre de ce que vous faites avec les données plutôt que d'avoir une réponse générale.