IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Somme en temps constant


Sujet :

Mathématiques

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut Somme en temps constant
    Bonjour,
    Dans tout cours qui traite de la complexité on trouve que le temps mis pour effectuer une somme est proportionnel à la taille des entiers mis en jeu.. Plus précisément, proportionnel à max( Log2(m), Log2(n) ), théorie mathématique à l'appui. Or quand je fais le test sous Python, je trouve un temps constant ! J'ai beau mettre de petits entier ou de grands entier, le résultat est toujours le même (environ 2 * 10^(-6) s sur ma machine).
    Quelqu'un a-t-il une explication.
    Merci bien.

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    J'espère bien que ta machine fait une addition d'entier en moins d'1 microseconde, même en Python !!

    Il y a essentiellement deux possibilités :
    1. La précision de tes mesures est discutable... Et visiblement elle l'est si tu crois qu'une addition prend 1 microseconde.
    2. Qu'appelle-tu un "grand" entier ? Tant que tu restes en dessous de 2^63 (+ de 10^18), il est assez probable que Python stocke ses entiers dans des entiers machines et que donc le coût d'une addition soit assez constant. C'est quand tu dépasses ces limites que les entiers commencent à être stockés et additionnés avec des algorithmes en O(log(max(n,m))).


    --
    Jedaï

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut
    pourtant voici mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from time import time
     
    m = eval(input("entrer m : "))
    n = eval(input("entrer n : "))
     
    t0 = time()
    m + n
    t1 = time()
     
    print(((t1 - t0)) * 10**6)
    j'obtiens toujours environ 2... donc 2 microsecondes... mon ordi est-il si lent ? ou ai-je fais une erreur. L'unité est bien en secondes ??

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    ... Quelle précision exactement attends-tu de time() ? Selon l'OS, tu peux avoir quelque chose de très mauvais, mais au mieux, tu ne dépasses pas la microseconde, donc ton expérience indique tout au plus que l'addition prend moins de 2 microsecondes.

    Pour faire un benchmark, on répète toujours l'opération qu'on souhaite mesurer. Et normalement, une boucle est suffisante. Mais ici, vu l'opération, tu as de bonne chance que tu mesures plutôt le coût de la boucle que celui de l'opération.

    Peut-être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    from time import time
     
    m = int(input("entrer m : "))
    n = int(input("entrer n : "))
     
    t0 = time()
    for i in range(10**7) :
      m + n
      m + n
      m + n
      m + n
      m + n
      m + n
      m + n
      m + n
      m + n
      m + n
    t1 = time()
     
    print((t1 - t0)*10)
    Mais je ne garantis en rien la précision de la mesure résultante... Enfin ça devrait être mieux (et en nanosecondes).

    --
    Jedaï

  5. #5
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Dans tout cours qui traite de la complexité on trouve que le temps mis pour effectuer une somme est proportionnel à la taille des entiers mis en jeu.
    Cet exemple montre bien que l'enseignement de la complexité est une aberration. Dans un processeur normal, le temps nécessaire pour calculer la somme de deux nombres est indépendant de la valeur des ces deux nombres.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  6. #6
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    Dans tout cours qui traite de la complexité on trouve que le temps mis pour effectuer une somme est proportionnel à la taille des entiers mis en jeu.
    J'ai l'impression que, dans la discussion qui précède, la " valeur " des entiers a été confondue avec la " taille ".

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Cet exemple montre bien que l'enseignement de la complexité est une aberration. Dans un processeur normal, le temps nécessaire pour calculer la somme de deux nombres est indépendant de la valeur des ces deux nombres.
    Je doute fortement que tu trouves beaucoup de cours sur la complexité où il est affirmé que l'addition de deux entiers se fait en O(log(max(n,m)) sans un rappel (ou un préalable) que l'addition de deux entiers machines (donc limités en taille, ce qui a son importance dans certains contextes, scientifique en particulier) est une opération à coût constant... (nonobstant ce que l'étudiant inattentif s'en rappelle)

    De plus, si tu crois vraiment que le coeur de l'enseignement de la complexité est sur la complexité des opérations arithmétiques élémentaires et que c'est pour ça que les gens suivent un cours sur la question, tu es vraiment complètement à côté de la plaque.

    Cette question était assez naïve mais elle a permis à Virgile d'aborder plusieurs points importants : déjà avoir une idée de l'ordre de grandeur du temps pris par une opération élémentaire est important, de plus faire un benchmark est rarement évident, surtout pour du code aussi rapide, il y a une différence entre les entiers machines (sur 32 ou de plus en plus, sur 64 bits) et les entiers mathématiques, de taille illimitée (sauf par la mémoire).

    J'ai l'impression que, dans la discussion qui précède, la " valeur " des entiers a été confondue avec la " taille ".
    La valeur ou plutôt le logarithme de la valeur est proportionnel à la taille nécessaire au stockage d'un entier (toujours en supposant qu'on ne se contente pas d'entiers machines), donc la distinction a peu d'importance.

    --
    Jedaï

Discussions similaires

  1. [XL-2003] Somme des temps dans un tableau croisé dynamique
    Par sabotage dans le forum Excel
    Réponses: 3
    Dernier message: 20/05/2011, 09h48
  2. transformer [i][j] en [k] avec accès en temps constant
    Par Benoit_T dans le forum SL & STL
    Réponses: 4
    Dernier message: 12/05/2009, 10h09
  3. Somme de temps regroupés par nom
    Par Jonathan Raucy dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/08/2008, 08h39
  4. somme des temps vb6 access
    Par meddeb2001 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/09/2007, 22h33
  5. somme de temps dans un StringGrid
    Par blondelle dans le forum C++Builder
    Réponses: 7
    Dernier message: 06/06/2006, 21h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo