[PYTHON] Die Leistung von PHP war besser als ich erwartet hatte

Der Anfang davon

Ich habe vor kurzem eine Weile darüber nachgedacht, Python zu studieren. Zunächst schreiben Sie ein Programm, das Primzahlen ausgibt, um ein Gefühl dafür zu bekommen.

Also habe ich versucht, die Geschwindigkeit mit C, PHP, JavaScript (Node.js) und Python3 zu vergleichen, weil es eine gute Idee ist.

Ausführung

C-Compiler

$ gcc --version
gcc (Ubuntu 8.3.0-6ubuntu1) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


PHP

$ php --version
PHP 7.2.19-0ubuntu0.19.04.1 (cli) (built: Jun  4 2019 14:44:42) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.19-0ubuntu0.19.04.1, Copyright (c) 1999-2018, by Zend Technologies

Node.js

$ node --version
v10.16.0

Python

$ python --version
Python 3.7.3

Quellcode

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>

int main()
{
    int maxNum = 65536;
    bool *a = (bool *)calloc(maxNum, sizeof(bool));
    a[2] = true;
    for (int i = 3; i < maxNum; i += 2) {
        bool p = true;
        int checkMax = (int)round(sqrt((double)i));
        for (int j = 2; j <= checkMax; ++j) {
            if (!a[j]) {
                continue;
            }
            if (i % j == 0) {
                p = false;
                break;
            }
        }
        if (p) {
            a[i] = true;
        }
    }
    for (int i = 2; i < maxNum; ++i) {
        if (a[i]) {
            printf("%d\n", i);
        }
    }
    return 0;
}

PHP

<?php

$maxNum = 65536;
$a = array_fill(0, $maxNum, false);
$a[2] = true;
for ($i = 3; $i < $maxNum; $i += 2) {
    $p = true;
    $checkMax = (int)round(sqrt((double)$i));
    for ($j = 2; $j <= $checkMax; ++$j) {
        if (!$a[$j]) {
            continue;
        }
        if ($i % $j === 0) {
            $p = false;
            break;
        }
    }
    if ($p) {
        $a[$i] = true;
    }
}
for ($i = 2; $i < $maxNum; ++$i) {
    if ($a[$i]) {
        printf("%d\n", $i);
    }
}

JavaScript

const maxNum = 65536;
const a = Array(maxNum);
a.fill(false);
a[2] = true;
for (let i = 3; i < maxNum; i += 2) {
    let p = true;
    const checkMax = parseInt(Math.round(Math.sqrt(parseFloat(i))));
    for (let j = 2; j <= checkMax; ++j) {
        if (!a[j]) {
            continue;
        }
        if (i % j === 0) {
            p = false;
            break;
        }
    }
    if (p) {
        a[i] = true;
    }
}
for (i = 2; i < maxNum; ++i) {
    if (a[i]) {
        console.log(i);
    }
}

Python

import math
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

maxNum = 65536
a = [False] * maxNum;
a[2] = True
for i in range(3, maxNum, 2):
    p = True
    checkMax = int(Decimal(str(math.sqrt(i))).quantize(Decimal('0'), rounding=ROUND_HALF_UP))
    for j in range(2, checkMax + 1):
        if not a[j]:
            continue
        if i % j  == 0:
            p = False;
            break;
    if p:
        a[i] = True;
for i in range(2, maxNum):
    if a[i]:
        print('%d' % i)

Ergebnis

C Die Zusammenstellung ist wie folgt. Es ist keine bestimmte Optimierung angegeben.

$ gcc p.c -lm
$ time ./a.out > /dev/null
./a.out > /dev/null  0.02s user 0.00s system 76% cpu 0.021 total

PHP

$ time php p.php > /dev/null
php p.php > /dev/null  0.22s user 0.01s system 93% cpu 0.249 total

Es dauert 10 mal so viel wie C. Node.js

$ time node p.js > /dev/null
node p.js > /dev/null  0.53s user 0.04s system 74% cpu 0.768 total

30 mal C. Python

$ time python p.py > /dev/null
python p.py > /dev/null  0.77s user 0.02s system 77% cpu 1.020 total

50 mal C.

Zusammenfassung

PHP war also schneller als alles andere. Dies ist unvermeidlich, da C am schnellsten ist.

Übrigens ist das Ergebnis der Umleitung des Ausgabeergebnisses in eine Datei und der Ermittlung des Hashwerts wie folgt.

$ md5sum *.txt
3c22247fa4a5c6a8b9009cfc70961f90  result_c.txt
3c22247fa4a5c6a8b9009cfc70961f90  result_js.txt
3c22247fa4a5c6a8b9009cfc70961f90  result_php.txt
3c22247fa4a5c6a8b9009cfc70961f90  result_python.txt
$ sha512sum *.txt
ae4a60fb2903b488179a36be80b5569153cc27a4989001af9015355fcd5ffa0ddd94cf64d0beeeaff4a51bd3cf8c8594d0d47379825b50a185d259840b20202c  result_c.txt
ae4a60fb2903b488179a36be80b5569153cc27a4989001af9015355fcd5ffa0ddd94cf64d0beeeaff4a51bd3cf8c8594d0d47379825b50a185d259840b20202c  result_js.txt
ae4a60fb2903b488179a36be80b5569153cc27a4989001af9015355fcd5ffa0ddd94cf64d0beeeaff4a51bd3cf8c8594d0d47379825b50a185d259840b20202c  result_php.txt
ae4a60fb2903b488179a36be80b5569153cc27a4989001af9015355fcd5ffa0ddd94cf64d0beeeaff4a51bd3cf8c8594d0d47379825b50a185d259840b20202c  result_python.txt

Es scheint, dass für alle die gleiche Ausgabe erzielt wurde. Wir haben nicht überprüft, ob es sich um eine Liste von Primzahlen handelt. Weil es eine Überprüfung ist, wie unterschiedlich die Ausführungsgeschwindigkeit mit demselben Algorithmus ist.

Ein Nachteil ist PHP, das bei der Parallelverarbeitung standardmäßig nicht multithreaded sein kann.

Recommended Posts

Die Leistung von PHP war besser als ich erwartet hatte
Ich habe die Leistung von 1 Million Dokumenten mit mongoDB gemessen
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Die Ordnerstruktur von Flask ist zusammengefasst
Ich kannte die Grundlagen von Python nicht
Die Python-Projektvorlage, an die ich denke.
Ich war in Schwierigkeiten, weil sich das Verhalten des Docker-Containers nicht geändert hat
P100-PCIE-16GB wurde der GPU von Google Colab hinzugefügt, bevor ich es wusste
AtCoder AGC 041 C - Ich war süchtig nach der vollständigen Suche nach Domino-Qualität
Die Verwaltung der Funktionsmenge von Kaggle war mit PostgreSQL besser als erwartet, daher habe ich ein Verzeichnis erstellt, das jeder mit Docker verwenden kann.
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Zusammenfassung der Unterschiede zwischen PHP und Python
Die Ungenauigkeit von Tensorflow war auf log (0) zurückzuführen.
Ich habe das tiefste Problem von Hiroshi Yuki gelöst.
Ich habe die Liste der Tastenkombinationen von Jupyter überprüft
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Probieren Sie Progate Free Edition [Python I]
Die Form der eindimensionalen Anordnung von Numpy war kompliziert
Ich habe die Sitzungsaufbewahrungsdauer von Django überprüft
Ich habe die Verarbeitungsgeschwindigkeit der numpy eindimensionalisierung überprüft
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
Ich habe die Varianten von UKR gelesen und implementiert
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Hier ist eine, ich werde die mit "künstlicher Intelligenz" ausgestatteten Anwendungen zusammenfassen, an denen ich interessiert war
Ich bin an php + twig gewöhnt, also habe ich die Template-Engine von Pyramid 1.5 auf jinja2 geändert.
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ② analysiert
[Wahrscheinlichkeit] Ich werde erklären, weil das Roboterproblem von Center 2020 Mathematics 1 ・ A interessant war.
Als ich Plotly zum Zeichnen eines interaktiven Diagramms verwendete, war es mehr als ich erwartet hatte.