Concurrence avec Python: à quelle vitesse C ++?

Le texte intégral est de 2969 mots et le temps d'apprentissage prévu est de 8 minutes

 

Concurrence avec Python: à quelle vitesse C ++?

Source: unsplash

Pour les data scientists, il existe d'innombrables raisons d'aimer Python. Mais avez-vous déjà posé la question: Quelle est la différence entre Python et des langages de programmation de bas niveau plus spécialisés tels que C ou C ++? Je pense que c'est une question que de nombreux spécialistes des données ou utilisateurs de Python se sont posées ou se poseront à l'avenir.

 

Il existe de nombreuses différences entre les langages Python et C ++. Cet article vous montrera à quelle vitesse C ++ est comparé à Python à travers un exemple très simple.

Concurrence avec Python: à quelle vitesse C ++?

 

Afin d'illustrer cette différence, cet article choisit une tâche simple et pratique plutôt qu'imaginaire: générer tous les k-mers d'ADN possibles avec une valeur fixe de «k». Cet exemple a été choisi parce que de nombreux traitements de données et analyses de tâches liées aux génomes (comme la génération de k-mers) sont intensifs en calcul, et c'est aussi la raison pour laquelle de nombreux data scientists dans le domaine de la bioinformatique s'intéressent au C ++.

Concurrence avec Python: à quelle vitesse C ++?

 

Veuillez noter que le but de cet article n'est pas de comparer C ++ et Python de la manière la plus efficace. Les deux codes peuvent être écrits de manière plus efficace et optimisée. Le seul objectif de cet article est de comparer la vitesse de ces deux langages en utilisant exactement les mêmes algorithmes et instructions.

 

Introduction aux ADN K-mers

 

L'ADN est une unité à longue chaîne appelée nucléotide. Dans l'ADN, il existe 4 types de nucléotides, représentés par les lettres A, C, G et T. Les humains (plus précisément Homo sapiens) ont 3 milliards de paires de nucléotides. Par exemple, une petite partie de l'ADN humain pourrait ressembler à:

 

ACTAGGGATCATGAAGATAATGTTGGTGTTTGTATGGTTTTCAGACAATT

 

Dans cet exemple, si vous sélectionnez 4 nucléotides consécutifs (c'est-à-dire des lettres) dans la chaîne, ce sera un k-mer de longueur 4 (il peut être appelé 4-mer). Voici quelques exemples de 4-mères dérivés de cet exemple: ACTA, CTAG, TAGG, AGGG, GGGA, etc.

 

Défi difficile

 

Cet article prend comme exemple la génération de tous les 13-mers possibles. Mathématiquement parlant, il s'agit d'un problème d'arrangement avec substitution. Par conséquent, il y a 4¹³ (67108864) 13-mers possibles. Ce qui suit utilisera un algorithme simple pour générer des résultats en C ++ et Python.

 

comparer le plan

 

Pour faciliter la comparaison des avantages et des inconvénients de C ++ et Python dans ce défi particulier, j'ai utilisé exactement le même algorithme dans les deux langues. Les deux codes sont conçus pour être simples et similaires. Dans le même temps, évitez d'utiliser des structures de données complexes ou des packages ou bibliothèques tiers. Le premier code est écrit en Python.

 

defconvert(c):
               if (c =='A'): return'C'
               if (c =='C'): return'G'
               if (c =='G'): return'T'
               if (c =='T'): return'A'
             print("Start")
             opt ="ACGT"
            s =""
            s_last =""
            len_str =13
             for i inrange(len_str):
               s += opt[0]
             for i inrange(len_str):
               s_last += opt[-1]
             pos =0
            counter =1
            while (s != s_last):
               counter +=1
               # You can uncomment the next line to see all k-mers.
               # print(s)
               change_next =True
               for i inrange(len_str):
                    if (change_next):
                        if (s[i] == opt[-1]):
                            s = s[:i] +convert(s[i]) + s[i+1:]
                            change_next =True
                        else:
                            s = s[:i] +convert(s[i]) + s[i+1:]
                            break
             # You canuncomment the next line to see all k-mers.
            # print(s)
            print("Number ofgenerated k-mers: {}".format(counter))
            print("Finish!")

 

Il faut environ 61,23 secondes pour exécuter le code Python pour générer 67 millions de 13 mers. Pour une comparaison équitable, j'ai commenté la ligne qui montre les k-mers. Si vous souhaitez les afficher lors de la génération de k-mers, vous pouvez également décommenter ces deux lignes. Notez que l'affichage de tous les k-mers prend beaucoup de temps. Si nécessaire, veuillez utiliser CTRL + C pour arrêter le code.

 

Maintenant, jetons un coup d'œil au même algorithme en C ++:

 

#include<iostream>
           #include<string>
             usingnamespacestd;
             charconvert(char c)
           {
              if (c == 'A') return'C';
              if (c == 'C') return'G';
              if (c == 'G') return'T';
              if (c == 'T') return'A';
              return' ';
           }
             intmain()
           {
              cout << "Start" << endl;
                 string opt = "ACGT";
              string s = "";
              string s_last = "";
              int len_str = 13;
              bool change_next;
                 for (int i=0; i<len_str;i++)
              {
                   s += opt[0];
              }
                 for (int i=0; i<len_str;i++)
              {
                   s_last += opt.back();
              }
                 int pos = 0;
              int counter = 1;
              while (s != s_last)
              {  
                   counter ++;
                   // You canuncomment the next line to see all k-mers.
                   // cout << s<< endl; 
                   change_next = true;
                   for (int i=0; i<len_str;i++)
                   {
                       if (change_next)
                       {
                           if (s[i] == opt.back())
                           {
                               s[i] = convert(s[i]);
                               change_next = true;
                           } else {
                               s[i] = convert(s[i]);
                               break;
                           }
                       }
                   }
              }
                 // You can uncomment the next line tosee all k-mers.
              // cout << s << endl;
              cout << "Number of generated k-mers: " <<counter << endl;
              cout << "Finish!" << endl;
              return0;
           }

 

Après avoir compilé et exécuté le code C ++, il faut environ 2,42 secondes pour générer 67 millions de 13-mers. Cela signifie que pour exécuter le même algorithme, Python prend 25 fois plus de temps que C ++. Ensuite, cette expérience a été répétée pour 14 mers et 15 mers. Les résultats récapitulatifs sont présentés dans le tableau suivant:

Concurrence avec Python: à quelle vitesse C ++?

Comparez les résultats d'exécution Python et C ++ qui génèrent 13, 14 et 15 mers.

De toute évidence, C ++ est beaucoup plus rapide que Python. Pour la plupart des programmeurs et des data scientists, c'est le consensus. Mais cet exemple montre que cette différence est significative.

 

Cet exemple n'utilise pas la parallélisation CPU ou GPU, car elle doit être effectuée pour les types de problèmes correspondants (problèmes parallèles intensifs). De plus, l'exemple n'implique pas beaucoup de mémoire. Si les résultats de l'opération sont stockés (pour certaines raisons spécifiques), l'utilisation de la gestion de la mémoire produira des différences plus significatives lors de l'exécution de C ++ et Python.

 

Cet exemple et des milliers d'autres faits montrent qu'en tant que data scientist, vous devez connaître les langages de type C ++ pour traiter de grandes quantités de données ou une croissance exponentielle.

Concurrence avec Python: à quelle vitesse C ++?

Partagez ensemble les matières premières de l'apprentissage et du développement de l'IA

Bienvenue pour suivre la «lecture de base» de l'auto-média vertical de la plate-forme complète AI

(Ajoutez l'éditeur WeChat: dxsxbb, rejoignez le cercle des lecteurs et discutez ensemble de la technologie d'intelligence artificielle la plus récente ~)

Je suppose que tu aimes

Origine blog.csdn.net/duxinshuxiaobian/article/details/112750998
conseillé
Classement