|
Publicité ' | ||||||||||||||||||||||||
|
|
#41 |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Depuis un mois, il y a un installeur .msi (je suppose qu'on ne peut pas l'utiliser sous Linux). Avant, il y avait un fichier zip avec tout dedans : sources, Makefile, README et même install-mono.sh.
Je regarde si c'est encore accessible quelque part. Sinon, je l'uploade dans l'après-midi. |
|
|
00
|
|
|
#42 | |||
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
Par ailleurs, j'ai un petit doute, regarde ce qui se passe pour 4 avec ta fonction. -- Jedaï |
|||
|
|
00
|
|
|
#43 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
reçu, je testerai ce soir... ça complétera les tests
et pour prolog, personne ne sait comment lancer ce qu'il faut en une ligne de commande avec swi ou gprolog ? |
|
|
00
|
|
|
#44 | |
![]() ![]() Inscription : septembre 2003 Messages : 4 443 ![]() |
Citation:
I'm back Si c'est pour mon programme naïf en Prolog, tu fais time(decomposition(N, L)). Je cherche à améliorer la rapidité de mon prog mais de toute façon, la méthode est lente, puisque je pars des listes déjà fabriquées et je dois vérifier avant de mémoriser que la liste n'esite pas déjà. Au passage, j'ai corrigé une fuite mémoire
__________________
"La haine seule fait des choix" - Koan Zen "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne. Faites du Prolog, ça vous changera les idées ! Ma page Prolog Mes codes sources commentés Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi |
|
|
|
00
|
|
|
#45 |
|
Expert Confirmé Sénior
![]() ![]() |
Après petit test de la version F# avec tableau pour mémoization, on utilise 44s pour 70 (avec -O3), contre 5s sur ma machine pour la même version en Haskell.
-- Jedaï |
|
|
00
|
|
|
#46 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
Citation:
au fait de quelle machine disposes-tu ? perso, c'est un portable centrino 1,6Ghz (simple coeur), 2Go Ram sous Linux (le reste n'a pas vraiment d'influence |
|
|
|
00
|
|
|
#47 | ||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
Citation:
ben sur ma machine avec swiprolog, ça donne 140ms pour 15, et stack overflow au-delà... Citation:
si c'est le prolog, je veux bien la correction |
||
|
|
00
|
|
|
#48 | |||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
Il n'y a pas de takeWhile dans la lib, je l'ai recodée. Et l'erreur, c'était juste dans la comparaison (j'ai pas dû poster la bonne version tout à l'heure). Code :
D'après un benchmark, les performances de F# sous Windows sont du même ordre que celles obtenues avec ocamlopt. Je pense donc qu'il est possible d'améliorer le temps (peut-être en utilisant un algo plus "classique", sans le lazy ?) Ceux qui ont testé F# ont dû se rendre compte que mon code génère un warning. C'est dû à la récursion dans la définition de la valeur (liste ou tableau), puisque c'est potentiellement risqué (Caml l'interdit). Le warning peut s'enlever avec le flag --no-warn 40. EDIT J'ai ajouté lazy, c'est un peu mieux. Je viens de me rendre compte qu'il y a un type LazyList dans la lib standard. Je vais tester. |
|||
|
|
00
|
|
|
#49 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
Je dis tout de suite que OCaml est normalement plus rapide qu'Haskell sur les mêmes algorithmes en général (parce qu'Haskell est paresseux et que ça rajoute un cout réel à toutes les opérations, d'où d'ailleurs l'importance de la qualité du compilateur). Je ne doute pas qu'il soit possible d'écrire un code plus rapide en OCaml ou F# qu'en Haskell, mais nous regardons aussi l'élégance et la facilité de maintenance des programmes (sinon nous pouvons tout de suite jeter l'éponge comme le code de Millie nous l'a montré !). Et j'aime à penser que jusqu'ici, à l'exception peut-être du code "à itérateur" (et encore, comparé au C++ ou au C...), la plupart des programmes fonctionnels restaient élégants et compréhensible, et compact également, ce qui a son importance pour la maintenance. -- Jedaï |
|
|
|
00
|
|
|
#50 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
(Il n'est pas vraiment à moi, mais je le squatte régulièrement disons... -- Jedaï |
|
|
|
00
|
|
|
#51 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
Citation:
perso, sur ma machine aussi... j'ai apache2, mysql, postgresql, nagios, munin, monit, openssh-server, vsftpd, cups ; divers gadgets gnome, des extensions firefox pour "tricher" à des jeux en ligne, etc mais il doit bien rester 1Go de dispo
|
|
|
|
00
|
|
|
#52 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
-- Jedaï |
|
|
|
00
|
|
|
#53 | |
|
Expert Confirmé Sénior
![]() ![]() |
Donc pour l'instant, j'ai quelques résultats de bench pour n=64 (ce qui est le maximum que je parviens à atteindre avec le ML de Gorgonite) :
Citation:
Je suis en train de corriger les temps pour le F#, dont la première exécution est nettement plus lente que les suivantes. (EDIT : Vous pouvez considérer que c'est fait) Pour Jedaï 3 (avec itérateur et unfoldr), j'ai également 14s pour 80, 56s pour 90, contre 0.45s pour 80 et 0.62s pour 90 avec Millie 2 et 5s pour 80 et 19s pour 90 avec TrapD 2. Jedaï 6 améliore un peu les choses avec 4.8s pour 80 et 17.2 s pour 90. Pour les version de Dividee, j'ai utilisé Python 2.5.1 et j'ai mesuré séparément chacune des versions de façon à éviter les problèmes d'allocation et de swap. La version 4 de Dividee est par contre impossible à mesurer sur mon ordinateur vu la place qu'elle prend en mémoire. -- Jedaï |
|
|
|
00
|
|
|
#54 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Voilà, je viens de traduire "bêtement" ton itérateur en F#. J'ai même pas essayé de comprendre le fonctionnement, je regarderai ça plus tard.
En effet, il est plus efficace que les autres que j'ai implémentés. Code :
|
||
|
|
00
|
|
|
#55 | ||
![]() ![]() ![]() Inscription : juin 2006 Messages : 6 934 ![]() |
J'ai ajouté des optimisations très sympatique qui devraient faire un peu gagner de temps :
Code C++ :
Notamment, la ligne : for(int i=n/taille; i<=n+1-taille; i++) qui était avant : for(int i=1; i<=n; i++) J'ai également dégagé les allocations dynamiques à chaque boucle avec std::vector.
__________________
Je ne répondrai à aucune question technique en privé |
||
|
|
00
|
|
|
#56 | ||
![]() ![]() Inscription : septembre 2003 Messages : 4 443 ![]() |
J'ai modifié le calcul et sans mémorisation des résultats, voici ce que j'obtiens
10 : 42 solutions durée 0.000 s 20 : 627 solutions durée 0.000s 30 : 5 604 solutions durée 0.000s 40 : 37 338 solutions durée 0.015 s 50 : 204 226 solutions durée 0.032 s 70 : 4 087 968 solutions durée 0.625 s 80 : 15 796 476 solutions durée 2.610 s 90 : 56 634 173 solutions durée 9.938 s 100 : 190 569 292 solutions durée 34.250 s Le bon est important entre 90 et 100 je ne sais pas pourquoi. [edit] on peut l'expliquer en remarquant que le nombre de décompositions de 100 est 933 fois plus grand que celui de 50, donc la durée est 900 fois plus importante pour 100 que pour 50 [/edit] Le code de la fonction de calcul est très simple, c'est une simple boucle tant que Code c :
__________________
"La haine seule fait des choix" - Koan Zen "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne. Faites du Prolog, ça vous changera les idées ! Ma page Prolog Mes codes sources commentés Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi |
||
|
|
00
|
|
|
#57 | ||
![]() ![]() Inscription : septembre 2003 Messages : 4 443 ![]() |
En modifiant légèrement le code et en choisisssant les options de compilation pour optimiser la vitesse, (/O2) j'obtiens
pour 50 : 0.016 s pour 70 : 0.250 s pour 80 : 1.016 s pour 90 : 3.781 s pour 100 : 13.104 s (soit une durée divisée par près de 3). le code : Code :
__________________
"La haine seule fait des choix" - Koan Zen "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne. Faites du Prolog, ça vous changera les idées ! Ma page Prolog Mes codes sources commentés Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi |
||
|
|
00
|
|
|
#58 | ||
|
Membre Expert
![]() Inscription : mars 2007 Messages : 858 ![]() |
Personne n'a encore posté de version Python alors voilà:
sums1 = algorithme de base (celui de LLB) sums2 = version avec mémoization sums3 = un générateur (un peu comme une version lazy) sums4 = version non récursive; programmation dynamique Les temps que j'obtiens sur mon T2400 @ 1.83 Ghz: sums1(64): 36 s sums2(64): 2.5 s sums3(64): 34 s sums4(64): 8.7 s Au niveau de l'utilisation mémoire, je n'ai pas fait de mesure précise, mais en gros sums4 demande plus de 1,2 GB de mémoire (!); sums2 environ 600 MB, sums1 200 MB, et sums3 est bien sur la plus économique, son utilisation mémoire ne dépendant que de la profondeur de la pile d'appels (tant qu'on n'a pas besoin de toutes les combinaisons en même temps). Je suis étonné que la version 4 (prog.dyn.) utilise deux fois plus de mémoire et est plus lent que la mémoization; j'ai pourtant essayé de ne générer que les combinaisons qui seront utilisées. Il y a certainement moyen de faire mieux. Code python :
|
||
|
|
00
|
|
|
#59 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Bon, je pense qu'on peut encore améliorer la mémoization avec liste infinie, mais en attendant voici le programme le plus rapide que j'ai créé pour l'instant, sur le principe de l'itérateur, mais meilleur que le précédent en cela qu'on n'a pas besoin de lire toute la liste à tous les coups car je donne les possibilités sous forme de n-uplet ascendant ce coup-ci :
Code :
-- Jedaï |
||
|
|
00
|
|
|
#60 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
-- Jedaï |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com