[PYTHON] J'ai créé un programme de sortie de table de nombres premiers dans différentes langues

J'ai essayé de créer un algorithme dans différentes langues que je voulais voir une fois et de le comparer, cette fois j'ai calculé 10000 nombres premiers dans un total de 9 langues, je l'ai sorti et j'ai affiché le temps nécessaire vu. Parmi ceux-ci, j'ai utilisé C, C ++, Java, PHP et JavaScript dans la pratique (bien que C et C ++ soient très éloignés dans la pratique de nos jours), et je n'ai jamais écrit de code de pratique (écrit par une personne). J'ai lu la source et l'ai réécrit dans un autre langage), mais j'ai touché Python et C # pendant un moment dans mon apprentissage personnel. Ruby, Go était la première fois que je l'ai touché.

Si vous voulez voir la source, veuillez consulter GitHub car ce sera trop long si vous mettez toutes les sources.

Pour le moment, la version et le temps pris pour chaque langue, et une brève impression. Au fait, toutes les machines utilisées sont macOS High Sierra.

Langage C

Apple LLVM version 10.0.0 (clang-1000.10.44.4) ~~ Total: 0,228 seconde ~~ Aucune optimisation Temps de calcul: 0,005386 secondes Temps de sortie: 0,005982 secondes Avec optimisation (O3) Temps de calcul: 0,003645 secondes Temps de sortie: 0,005690 secondes

La langue que j'ai utilisée lors de ma première programmation (cours de calcul numérique lorsque j'étais étudiant). C'est rapide, mais il y a de nombreuses restrictions et cela semble un peu difficile à utiliser fonctionnellement.

int* generate_primes(int total)
{
    int* primes = malloc(sizeof(int) * total);
    primes[0] = 2;
    int x = 1;
    int j = 0;
    int k = 1;
    while (k < total) {
        x += 2;
        j = 0;
        while (j < k && x % primes[j] != 0) {
            if (primes[j] * primes[j] >= x) {
                primes[k++] = x;
                break;
            }
            j++;
        }
    }
    return primes;
}

C++ Apple LLVM version 10.0.0 (clang-1000.10.44.4) ~~ Total: 0,234 secondes ~~ Aucune optimisation Temps de calcul: 0,006875 secondes Temps de sortie: 0,010263 secondes Avec optimisation (O3) Temps de calcul: 0,003388 secondes Temps de sortie: 0,008505 secondes J'avais l'habitude de l'utiliser quand j'étais dans la deuxième entreprise (j'étais résidente chez le client et faisais du traitement d'image avec OpenCV). Cela dit, j'ai écrit le code C ++ pour la première fois depuis longtemps. C'est rapide car c'est une extension du langage C. On dit souvent que c'est un langage compliqué et difficile, mais si vous avez de l'expérience avec C et avez une certaine connaissance de l'orientation objet, vous le trouverez plus facile à utiliser car il a plus de fonctions que C. Dans le code ci-dessous, new est utilisé pour sécuriser la zone du tableau, mais la suppression est effectuée par l'appelant.

int* generate_primes(int total)
{
    int* primes = new int[total];
    primes[0] = 2;
    int x = 1;
    int k = 1;
    while (k < total) {
        int j = 0;
        x += 2;
        while (j < k && x % primes[j] != 0) {
            if (primes[j] * primes[j] >= x) {
                primes[k++] = x;
                break;
            }
            j++;
        }
    }
    return primes;
}

Java Java 1.8.0_202 ~~ Total: 0,487 secondes ~~ Temps de calcul: 0,007632128 secondes Temps de sortie: 0,358596283 secondes

Je l'utilise dans mon entreprise actuelle. Lorsque je l'utilise pour les affaires, j'utilise Eclipse, donc je ne peux pas le compiler sur la console à moins que ce ne soit le cas. Un langage utilisé à diverses fins telles que le Web, les smartphones et l'intégration. Est-ce un inconvénient que le démarrage de la VM prend un certain temps? PostScript 2019/7/7 Si je le modifie pour que le temps de calcul et le temps de traitement soient séparés cette fois, le temps de sortie est beaucoup plus long que les autres. Pourquoi?

    static int[] generatePrimes(int total) {
        int primes[] = new int[total];
        primes[0] = 2;
        int k = 1;
        for (int x = 3; k < total; x += 2) {
            int i = 0;
            while (i < k && x % primes[i] != 0) {
                if (primes[i] * primes[i] >= x) {
                    primes[k++] = x;
                    break;
                }
                i++;
            }
        }
        return primes;
    }

Python Python 3.7.2 ~~ Total: 8,811 secondes ~~ Temps de calcul: 0,160643435 secondes Temps de sortie: 0,037948827 secondes Je l'utilise depuis un certain temps, par exemple pour étudier l'apprentissage automatique, et dans mon travail, je lis des sources écrites par des gens, mais j'écris rarement Python moi-même. Une riche bibliothèque d'apprentissage automatique, de calculs numériques, de statistiques, etc. C'était de loin la plus lente des langues que j'ai essayées cette fois. Y a-t-il un problème d'écriture? De plus, sur Mac, Python2 est souvent inclus par défaut, donc passer à 3 était un peu ennuyeux. PostScript 2019/7/7 Même avec une logique améliorée, Python est toujours le plus lent. Est-ce quelque chose comme ça, ou y a-t-il un moyen de le rendre plus rapide?

    def generate_primes(self, total) :
        primes = [0] * total
        primes[0] = 2
        x = 1
        k = 1
        while (k < total):
            x += 2
            j = 0;
            while (j < k and x % primes[j] != 0):
                if (primes[j] * primes[j] >= x):
                    primes[k] = x
                    k = k + 1
                    break
                j = j + 1
        return primes

PHP PHP 7.1.23 ~~ Total: 2,589 secondes ~~ Temps de calcul: 0,058230876922607 secondes Temps de sortie: 0,033617973327637 secondes Je l'ai utilisé dans l'entreprise précédente. Il est principalement utilisé uniquement dans le développement Web et est souvent développé à l'aide d'un framework (j'utilise généralement Laravel). Vous pouvez l'écrire librement, mais soyez prudent car vous pourriez avoir des habitudes étranges si vous ne faites pas attention.

    public function generate_primes($total) {
        $primes = array_fill(0, $total, 0);
        $primes[0] = 2;
        $x = 1;
        $k = 1;
        while ($k < $total) {
            $x += 2;
            $j = 0;
            while ($j < $k && $x % $primes[$j] != 0) {
                if ($primes[$j] * $primes[$j] >= $x) {
                    $primes[$k++] = $x;
                    break;
                }
                $j++;
            }
        }
        return $primes;
    }

Ruby ruby 2.3.7 ~~ Total: 2,872 secondes ~~ Temps de calcul: 0,07298700 secondes Temps de sortie: 0,0931 1000 secondes Je ne l'ai jamais utilisé dans la pratique ou dans l'étude personnelle (après tout). C'est la première fois que j'écris du code Ruby de ma vie. Langue fabriquée au Japon, Ruby on Rails est célèbre.

    def generate_primes(total)
        $primes = []
        $primes[0] = 2
        x = 1
        k = 1
        while (k < total)
            x += 2
            j = 0
            while (j < k && ((x % $primes[j]) != 0))
                if ($primes[j] * $primes[j] >= x)
                    $primes[k] = x
                    k += 1
                    break
                end
                j += 1
            end
        end
        return $primes
    end

C# Mono C# compiler version 5.20.1.19 ~~ Total: 0,261 seconde ~~ Temps de calcul: 0,005 secondes Temps de sortie: 0,092 secondes (Le titre est marqué vers le bas, donc la netteté des minuscules ne peut pas être bien affichée, donc je l'ai fait en haut.) Ce n'était pas du tout, mais j'ai eu la chance de le toucher un peu à la première entreprise dans une langue que je n'avais pas beaucoup utilisée. Il est souvent utilisé pour le développement de systèmes et de jeux sous Windows, mais il peut être compilé sur Mac en utilisant Mono. PostScript 2019/7/7 Je n'ai pas pu trouver un moyen de mesurer jusqu'à microsecondes en C #. J'apprécierais que quelqu'un puisse me le dire.

    int[] generate_primes(int total)
    {
        int[] primes = new int[1];
        Array.Resize(ref primes, total);
        primes[0] = 2;
        int x = 1;
        int j = 0;
        int k = 1;
        while (k < total) {
            x += 2;
            j = 0;
            while (j < k && x % primes[j] != 0) {
                if (primes[j] * primes[j] >= x) {
                    primes[k++] = x;
                    break;
                }
                j++;
            }
        }
        return primes;
    }

JavaScript Node.js v10.15.3 ~~ Total: 0,421 seconde ~~ Temps de calcul: 0,020833395004272462 secondes Temps de sortie: 0,186976930975914 secondes Un langage indispensable pour le développement front-end. Les cadres tels que Angular, React et Vue.js sont populaires de nos jours. Autre que l'avant, vous pouvez utiliser Node.js pour le déplacer.

function generate_primes(n) {
    var primes = Array(n);
    primes[0] = 2;
    var x = 1;
    var j = 0;
    var k = 1;
    while (k < n) {
        x += 2;
        j = 0;
        while (j < k && x % primes[j] != 0) {
            if (primes[j] * primes[j] >= x) {
                primes[k++] = x;
                break;
            }
            j++;
        }
    }

    return primes;
}

Aller langue

go version go1.12.5 darwin/amd64 ~~ Total: 0,566 seconde ~~ Temps de calcul: 0,008543 secondes Temps de sortie: 0,060843 secondes Je ne l'ai jamais utilisé dans la pratique ou dans l'étude personnelle (après tout). C'est la première fois que j'écris du code Go de ma vie. Un langage développé par Google. Je ne connais pas les détails, mais cela semble être populaire ces jours-ci.

func generate_primes(total int) []int {
    var primes [] int
    primes = append(primes, 2)
    var x, j, k int = 1, 0, 1
    for {
        if k >= total {
            break
        }
        x += 2
        j = 0
        for {
        	if j >= k || x % primes[j] == 0 {
                break
            }
            if primes[j] * primes[j] > x {
                k++
                primes = append(primes, x)
                break
            }
            j++
        }
    }
    return primes
}

En le regardant de cette manière, même si le style d'écriture est différent selon la langue, la façon de penser est commune à toutes les langues (petit sentiment moyen). Après tout, le langage de programmation est intéressant. Si j'ai une chance, j'aimerais faire la même chose dans une langue autre que celle que j'ai utilisée cette fois. Les candidats sont Kotlin, Swift, Rust, Scala, VB.net.

PostScript 2019/7/7 Sur la base des conseils donnés dans la section commentaire, nous avons amélioré la méthode de calcul et l'avons séparée car le temps de la partie calcul et la partie sortie du nombre premier étaient les mêmes. Merci beaucoup.

Recommended Posts

J'ai créé un programme de sortie de table de nombres premiers dans différentes langues
J'ai fait un programme de gestion de la paie en Python!
J'ai créé un programme cryptographique César en Python.
J'ai fait une commande pour générer un commentaire pour une table dans Django
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
Un programme qui détermine si un nombre entré en Python est un nombre premier
J'ai créé un plugin pour générer une table Markdown à partir de csv avec Vim
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
[CodeIQ] J'ai essayé de résoudre "Le sujet de cette semaine: Groupe créé avec une table de correspondance numérique" en Ruby (+11 langues)
J'ai fait un graphique de nombres aléatoires avec Numpy
〇✕ J'ai fait un jeu
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai fait un script pour mettre un extrait dans README.md
HMAC en plusieurs langues
J'ai fait une commande pour marquer le clip de la table
Premier nombre 2 en Python
Hello World! Liste de sortie en plusieurs langues (mise à jour prévue en temps opportun)
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai créé un lecteur de flux rapide en utilisant feedparser en Python
J'ai fait un jeu de combat Numer0n en Java (j'ai aussi fait de l'IA)
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai créé un programme automatisé pour coller du squishy dans Excel
J'ai implémenté N-Queen dans différentes langues et mesuré la vitesse
Sortie de la structure de table dans Django
J'ai fait un texte Python
J'ai fait un robot discord
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai créé un site d'apprentissage C ++
[AOJ] Tri décroissant dans différentes langues
J'ai fait un Line-bot avec Python!
J'ai créé un script de traduction basé sur CUI (2)
J'obtiens une KeyError dans pyclustering.xmeans
Générateur principal infini en Python3
J'ai fait une loterie avec Python.
Générateur de nombres premiers par Python
J'ai créé un script de traduction basé sur CUI
C'est un nombre premier ... Comptez les nombres premiers ...
Énumération des nombres premiers sur une ligne
J'ai créé un démon avec Python
Lors de l'écriture d'un programme en Python
J'ai créé une application Web en Python qui convertit Markdown en HTML
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑥ Programme d'apprentissage
J'ai créé un bot Discord en Python qui se traduit quand il réagit
J'ai créé un outil CLI pour convertir les images de chaque répertoire en PDF
Je souhaite convertir une table convertie en PDF en Python en CSV
J'ai fait une sorte d'outil de traitement d'image simple en langage Go.
J'ai créé un programme pour vous avertir par LINE lorsque les commutateurs arrivent
J'ai créé un script en python pour convertir des fichiers .md au format Scrapbox
J'ai créé un programme pour saisir ce que j'ai mangé et afficher les calories et les sucres
[IOS] J'ai créé un widget qui affiche la tendance de Qiita dans Pythonista3. [Python]
J'ai fait une erreur en récupérant la hiérarchie avec MultiIndex of pandas
Je voulais faire un programme de notation polonaise inversée en Python (détermination de savoir si une chaîne de caractères peut être convertie en valeur numérique)
J'ai créé un programme en Python qui lit les données FX CSV et crée un grand nombre d'images de graphiques