[PYTHON] Ich habe ein Ausgabeprogramm für Primzahlentabellen in verschiedenen Sprachen erstellt

Ich habe versucht, einen Algorithmus in verschiedenen Sprachen zu erstellen, den ich einmal sehen und vergleichen wollte. Dieses Mal habe ich 10.000 Primzahlen in insgesamt 9 Sprachen berechnet, ausgegeben und die benötigte Zeit angezeigt sah. Von diesen habe ich in der Praxis C, C ++, Java, PHP und JavaScript verwendet (obwohl C und C ++ heutzutage in der Praxis weit voneinander entfernt sind), und ich habe nie einen Übungscode geschrieben (von einer Person geschrieben). Ich habe die Quelle gelesen und in einer anderen Sprache umgeschrieben, aber ich habe Python und C # für eine Weile in meinem persönlichen Lernen berührt. Ruby, Go war das erste Mal, dass ich es berührte.

Wenn Sie die Quelle sehen möchten, lesen Sie bitte GitHub.

Vorerst die Version und die Zeit, die für jede Sprache benötigt werden, sowie ein kurzer Eindruck. Alle verwendeten Maschinen sind übrigens macOS High Sierra.

C Sprache

Apple LLVM version 10.0.0 (clang-1000.10.44.4) ~~ Gesamt: 0,228 Sekunden ~~ Keine Optimierung Berechnungszeit: 0,005386 Sekunden Ausgabezeit: 0,005982 Sekunden Mit Optimierung (O3) Berechnungszeit: 0,003645 Sekunden Ausgabezeit: 0,005690 Sekunden

Die Sprache, die ich beim ersten Programmieren verwendet habe (numerische Berechnungsklasse, als ich Student war). Es ist schnell, aber es gibt viele Einschränkungen und es fühlt sich ein wenig schwierig an, es funktional zu verwenden.

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) ~~ Gesamt: 0,234 Sekunden ~~ Keine Optimierung Berechnungszeit: 0,006875 Sekunden Ausgabezeit: 0,010263 Sekunden Mit Optimierung (O3) Berechnungszeit: 0,003388 Sekunden Ausgabezeit: 0,008505 Sekunden Ich habe es verwendet, als ich in der zweiten Firma war (ich war beim Kunden ansässig und habe die Bildverarbeitung mit OpenCV durchgeführt). Trotzdem habe ich den C ++ - Code zum ersten Mal seit einiger Zeit geschrieben. Es ist schnell, weil es eine Erweiterung der C-Sprache ist. Es wird oft gesagt, dass es sich um eine komplizierte und schwierige Sprache handelt. Wenn Sie jedoch Erfahrung mit C haben und über Kenntnisse der Objektorientierung verfügen, ist die Verwendung einfacher, da sie mehr Funktionen als C hat. Im folgenden Code wird new verwendet, um den Array-Bereich zu sichern, das Löschen erfolgt jedoch durch den Aufrufer.

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 ~~ Gesamt: 0,487 Sekunden ~~ Berechnungszeit: 0,007632128 Sekunden Ausgabezeit: 0,358596283 Sekunden

Ich benutze es in meiner aktuellen Firma. Wenn ich es für geschäftliche Zwecke verwende, verwende ich Eclipse, sodass ich es möglicherweise nicht auf der Konsole kompilieren kann, es sei denn, dies ist der Fall. Eine Sprache, die für verschiedene Zwecke wie das Web, Smartphones und das Einbetten verwendet wird. Ist es ein Nachteil, dass das Starten der VM einige Zeit dauert? Nachtrag 2019/7/7 Wenn ich es so ändere, dass die Berechnungszeit und die Verarbeitungszeit dieses Mal getrennt sind, ist die Ausgabezeit viel länger als die anderen. Warum?

    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 ~~ Gesamt: 8,811 Sekunden ~~ Berechnungszeit: 0,160643435 Sekunden Ausgabezeit: 0,037948827 Sekunden Ich benutze es für eine Weile, zum Beispiel um maschinelles Lernen zu studieren, und in meiner Arbeit lese ich Quellen, die von Menschen geschrieben wurden, aber ich schreibe Python selbst selten. Eine umfangreiche Bibliothek mit maschinellem Lernen, numerischen Berechnungen, Statistiken usw. Es war mit Abstand die langsamste der Sprachen, die ich diesmal ausprobiert habe. Gibt es ein Problem beim Schreiben? Auf einem Mac ist Python2 häufig standardmäßig enthalten, sodass der Wechsel zu 3 etwas ärgerlich war. Nachtrag 2019/7/7 Trotz verbesserter Logik ist Python immer noch am langsamsten. Ist es so etwas oder gibt es eine Möglichkeit, es schneller zu machen?

    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 ~~ Gesamt: 2,589 Sekunden ~~ Berechnungszeit: 0,058230876922607 Sekunden Ausgabezeit: 0.033617973327637 Sekunden Ich habe es bei der vorherigen Firma benutzt. Es wird meistens nur in der Webentwicklung verwendet und oft mit einem Framework entwickelt (ich benutze normalerweise Laravel). Sie können es frei schreiben, aber seien Sie vorsichtig, da Sie möglicherweise seltsame Gewohnheiten bekommen, wenn Sie nicht vorsichtig sind.

    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 ~~ Gesamt: 2,872 Sekunden ~~ Berechnungszeit: 0,07298700 Sekunden Ausgabezeit: 0,0931 1000 Sekunden Ich habe es (immerhin) nie in der Praxis oder im persönlichen Studium benutzt. Dies ist das erste Mal in meinem Leben, dass ich Ruby-Code geschrieben habe. Ruby on Rails ist eine in Japan hergestellte Sprache und berühmt.

    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 ~~ Gesamt: 0,261 Sekunden ~~ Berechnungszeit: 0,005 Sekunden Ausgabezeit: 0,092 Sekunden (Der Titel ist markiert, daher kann die Schärfe des Kleinbuchstabens nicht gut angezeigt werden, daher habe ich ihn in Großbuchstaben geschrieben.) Es war überhaupt nicht, aber es war eine Sprache, die ich nicht viel benutzt hatte, und ich hatte die Gelegenheit, sie bei der ersten Firma ein wenig zu berühren. Es wird häufig für die Systementwicklung und Spieleentwicklung unter Windows verwendet, kann jedoch mit Mono auf einem Mac kompiliert werden. Nachtrag 2019/7/7 Ich konnte in C # keine Möglichkeit finden, bis zu Mikrosekunden zu messen. Ich würde es begrüßen, wenn mir jemand sagen könnte.

    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 ~~ Gesamt: 0,421 Sekunden ~~ Berechnungszeit: 0,020833395004272462 Sekunden Ausgabezeit: 0,186976930975914 Sekunden Eine Sprache, die für die Front-End-Entwicklung unverzichtbar ist. Frameworks wie Angular, React und Vue.js sind heutzutage sehr beliebt. Anders als auf der Vorderseite können Sie Node.js verwenden, um es zu verschieben.

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;
}

Geh Sprache

go version go1.12.5 darwin/amd64 ~~ Gesamt: 0,566 Sekunden ~~ Berechnungszeit: 0,008543 Sekunden Ausgabezeit: 0,060843 Sekunden Ich habe es (immerhin) nie in der Praxis oder im persönlichen Studium benutzt. Dies ist das erste Mal in meinem Leben, dass ich Go-Code schreibe. Eine von Google entwickelte Sprache. Ich kenne die Details nicht, aber es scheint heutzutage beliebt zu sein.

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
}

Wenn man es so betrachtet, ist die Denkweise allen Sprachen gemeinsam, auch wenn der Schreibstil je nach Sprache unterschiedlich ist (kleines Durchschnittsgefühl). Immerhin ist die Programmiersprache interessant. Wenn ich eine Chance habe, möchte ich dasselbe in einer anderen Sprache als der tun, die ich diesmal verwendet habe. Kandidaten sind Kotlin, Swift, Rust, Scala, VB.net.

Nachtrag 2019/7/7 Basierend auf den Empfehlungen im Kommentarbereich haben wir die Berechnungsmethode verbessert und getrennt, da die Zeit für den Berechnungsteil und den Ausgabeteil der Primzahl gleich war. Vielen Dank.

Recommended Posts

Ich habe ein Ausgabeprogramm für Primzahlentabellen in verschiedenen Sprachen erstellt
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
Ich habe einen Befehl zum Generieren eines Kommentars für eine Tabelle in Django eingegeben
Ich habe ein Programm erstellt, das die Fehlersuche in Sekunden löst
Ein Programm, das bestimmt, ob eine in Python eingegebene Zahl eine Primzahl ist
Ich habe ein Plugin erstellt, um mit Vim eine Markdown-Tabelle aus CSV zu generieren
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
[CodeIQ] Ich habe versucht, "Das Thema dieser Woche: Gruppe erstellt mit Nummernkorrespondenztabelle" in Ruby (+11 Sprachen) zu lösen.
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
〇✕ Ich habe ein Spiel gemacht
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe ein Skript erstellt, um ein Snippet in README.md einzufügen
HMAC in verschiedenen Sprachen
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Primzahl 2 in Python
Hello World! Ausgabeliste in verschiedenen Sprachen (zeitnahe Aktualisierung geplant)
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe einen schnellen Feed-Reader mit Feedparser in Python erstellt
Ich habe ein Numer0n-Kampfspiel in Java gemacht (ich habe auch KI gemacht)
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Ich habe ein automatisiertes Programm zum Einfügen von Squishy in Excel erstellt
Ich habe N-Queen in verschiedenen Sprachen implementiert und die Geschwindigkeit gemessen
Ausgabe der Tabellenstruktur in Django
Ich habe einen Python-Text gemacht
Ich habe einen Zwietrachtbot gemacht
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Ich habe eine C ++ - Lernseite erstellt
[AOJ] Absteigende Sortierung in verschiedenen Sprachen
Ich habe einen Line-Bot mit Python gemacht!
Ich habe ein CUI-basiertes Übersetzungsskript erstellt (2)
Ich erhalte einen KeyError in pyclustering.xmeans
Unendlicher Primgenerator in Python3
Ich habe mit Python eine Lotterie gemacht.
Primzahlgenerator von Python
Ich habe ein CUI-basiertes Übersetzungsskript erstellt
Es ist eine Primzahl ... Zähle die Primzahlen ...
Primzahlaufzählung in einer Zeile
Ich habe mit Python einen Daemon erstellt
Beim Schreiben eines Programms in Python
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
Ich habe mit dem Lernprogramm TensorFlow --⑥ einen Dir en grey face-Klassifikator erstellt
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Ich habe ein CLI-Tool erstellt, um Bilder in jedem Verzeichnis in PDF zu konvertieren
Ich möchte eine in Python in PDF konvertierte Tabelle wieder in CSV konvertieren
Ich habe eine Art einfaches Bildverarbeitungswerkzeug in der Sprache Go erstellt.
Ich habe ein Programm erstellt, um Sie per LINE zu benachrichtigen, wenn Schalter eintreffen
Ich habe ein Skript in Python erstellt, um MDD-Dateien in das Scrapbox-Format zu konvertieren
Ich habe ein Programm erstellt, um einzugeben, was ich gegessen habe, und um Kalorien und Zucker anzuzeigen
[IOS] Ich habe ein Widget erstellt, das den Trend von Qiita in Pythonista3 anzeigt. [Python]
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ich wollte ein Programm mit umgekehrter polnischer Notation in Python erstellen (Bestimmung, ob eine Zeichenfolge in einen numerischen Wert konvertiert werden kann)
Ich habe in Python ein Programm erstellt, das FX-CSV-Daten liest und eine große Anzahl von Diagrammbildern erstellt