Unterschiede in der Multithread-Verarbeitung zwischen Python und Jython

Es scheint, dass zwei oder mehr Threads aufgrund des Einflusses von GIL (Global Interpreter Lock) beim Threading nicht gleichzeitig parallel arbeiten. Thread of Python (CPython) (obwohl es parallel funktioniert). Dann habe ich mich gefragt, was mit anderen Implementierungen ist, also habe ich es mit Jython überprüft. Außerdem kann Jython die Java-API verwenden, daher habe ich auch java.lang.Thread überprüft.

Überprüfungsumgebung

Quellcode der Überprüfung

Erstellen Sie einen Worker, der Aufgaben verteilt und berechnet, die Primzahlen im Bereich von 4 bis 100.000 auflisten. Das Folgende ist beim Threading. Thread wird verwendet.

py_worker.py


from threading import Thread

class Worker(Thread):
    def __init__(self, start, end):
        super(Worker, self).__init__()
        self._start = start
        self._end = end

    def run(self):
        self.prime_nums = []
        for i in xrange(self._start, self._end):
            if not 0 in self._remainders(i):
                self.prime_nums.append(i)

    def _remainders(self, end, start=2):
        for i in xrange(start, end):
            yield end % i

Folgendes ist bei Verwendung von java.lang.Thread der Fall. (Nur die zu importierende Klasse ist unterschiedlich)

jy_worker.py


from java.lang import Thread

class Worker(Thread):
    def __init__(self, start, end):
        super(Worker, self).__init__()
        self._start = start
        self._end = end

    def run(self):
        self.prime_nums = []
        for i in xrange(self._start, self._end):
            if not 0 in self._remainders(i):
                self.prime_nums.append(i)

    def _remainders(self, end, start=2):
        for i in xrange(start, end):
            yield end % i

Der Vorgang des Tretens des Arbeiterfadens und des Messens der verstrichenen Zeit ist wie folgt.

main.py


import sys
from threading import Thread
from datetime import datetime

def total_seconds(td):
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

if __name__ == '__main__':
    argv = sys.argv
    argc = len(argv)
    if argc < 4:
        print 'ERROR: <worker_module> <n_workers> <max_value>'
        sys.exit(1)
    worker_module = argv[1]
    n_workers = int(argv[2])
    max_value = int(argv[3])
    min_value = 4
    interval = (max_value - min_value) / n_workers
    Worker = __import__(worker_module).Worker

    workers = []
    for start in xrange(4, max_value, interval):
        print 'Worker: %s, %s' % (start, start+interval)
        worker = Worker(start, start+interval)
        workers.append(worker)

    start_time = datetime.utcnow()
    for worker in workers:
        worker.start()
    for worker in workers:
        worker.join()
    end_time = datetime.utcnow()
    elapsed_time = end_time - start_time
    elapsed_sec = total_seconds(elapsed_time)
    n_primes = sum([len(w.prime_nums) for w in workers])
    print '# of primes = %s, time = %s sec' % (n_primes, elapsed_sec)

Ergebnis

Die verstrichene Zeit bis zum Abschluss der Worker-Verarbeitung ist wie folgt.

Implementierung Klasse 1 thread 2 threads
Python threading.Thread 100 sec 125 sec
Jython threading.Thread 101 sec 73 sec
Jython java.lang.Thread 101 sec 77 sec

Python kann jeweils nur einen Thread ausführen. Wenn Sie ihn also auf zwei Threads verteilen, wird er nicht schneller (eher langsamer), aber Jython liefert unterschiedliche Ergebnisse.

Da die verstrichene Zeit in einem Thread in Python und Jython fast gleich ist, wird sich die grundlegende Leistung für die diesmal verwendete Verarbeitung meiner Meinung nach nicht ändern. (Eigentlich hatte ich erwartet, dass Jython aufgrund der dynamischen Kompilierung von Java schneller sein würde.) Und im Fall von Jython wurden 2 Threads früher als 1 Thread beendet, sodass es sich anfühlt, als würden sie parallel arbeiten. Ich frage mich, ob die Operation hier implementierungsabhängig ist.

Recommended Posts

Unterschiede in der Multithread-Verarbeitung zwischen Python und Jython
Unterschied in der Authentizität zwischen Python und JavaScript
Unterschiede zwischen Ruby und Python im Umfang
Unterschiede zwischen Python- und Java-Syntax
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Unterschied zwischen Python, Stftime und Strptime
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
Unterschied zwischen Ruby und Python (grundlegende Syntax)
Unterschiede zwischen queryStringParameters und multiValueQueryStringParameters in AWS Lambda
Zusammenfassung der Unterschiede zwischen PHP und Python
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
Über den Unterschied zwischen "==" und "is" in Python
Unterschiede in der Zeichenfolgenverarbeitung zwischen Python, Ruby, JS und PHP (Kombination und Variablenerweiterung)
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Berechnen Sie Pose- und Transformationsunterschiede in Python mit ROS
Stapel und Warteschlange in Python
Gegenseitige Konvertierung zwischen JSON und YAML / TOML in Python
Unterschied zwischen return, return None und no return description in Python
Unittest und CI in Python
Vergleiche "log and infininity" mit Gauche (0.9.4) und Python (3.5.1)
Unterschiede im Verhalten zwischen den Operatoren append () und "+ =" beim Hinzufügen von Daten zu einer Liste in Python
Python-Modul num2words Verhaltensunterschied zwischen Englisch und Russisch
Listenverkettungsmethode in Python, Unterschied zwischen list.extend () und dem Operator "+"
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Unterschied zwischen Ruby und Python Split
Unterschied zwischen Windows- und Linux-Verzeichnissen
Unterschied zwischen Java und Python (Memo)
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Zeigen Sie Fotos in Python und HTML an
Sortieralgorithmus und Implementierung in Python
Bearbeiten Sie Dateien und Ordner in Python
Über Python und Cython dtype
Zuweisungen und Änderungen in Python-Objekten
Zusammenarbeit zwischen Python-Modul und API
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP
Hashing von Daten in R und Python
Funktionssynthese und Anwendung in Python
Exportieren und Ausgeben von Dateien in Python
[Python] Unterschied zwischen Funktion und Methode
Reverse Flat Pseudonym und Katakana in Python2.7
Lesen und Schreiben von Text in Python
[GUI in Python] PyQt5-Menü und Symbolleiste-
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
Unterschiede in Identität, Äquivalenz und Aliasnamen
Unterschiede zwischen Python, read (), readline (), readlines ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
Erstellen und lesen Sie Messagepacks in Python
Zusammenfassung der Unterschiede zwischen Python und PHP (Vergleichstabelle der Hauptelemente)
Funktion zum Öffnen einer Datei in Python3 (Unterschied zwischen open und codecs.open und Geschwindigkeitsvergleich)
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Überlappende reguläre Ausdrücke in Python und Java
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.