Multiprocessing auf alter und neuer Hardware

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

So, ich wollte es mal wissen. Basierend auf den Hinweis von DasIch http://www.python-forum.de/viewtopic.ph ... 15#p286942 habe ich den Beispielcode der Python-Dokumentation genommen und auf alter und neuer Hardware laufen lassen:

Neu: MacBook Pro 12.1, Core i5, 2.7GHz, 2 Kerne mit Hyperthreading (System 10.11.1)
Alt: MacPro 1.1, 2.66GHz, 2 mal Dual-Core Intel Xeon Woodcrest (System 10.6.8)

Beide mit Python 3.5.0

Ergebnis (sec, gerundet):
Neu, single: 3.90
Neu, multi : 2.22
Alt, single: 7.12
Alt, multi : 2.57

Mit Python 2.7.10:
Neu, single: 2.71
Alt, single: 5.54

Das Ergebnis ist nur grob, da alle Hintergrundprozesse weiterliefen und ich time.time() verwendet habe.

Aber: Python 2.7 ist doch deutlich schneller als 3.5.
Echte Kerne sind durch Hyperthreading nicht zu ersetzten.
Und: auch alte Hardware bleibt inzwischen lange praxistauglich.

Hier der Beispielcode:

Code: Alles auswählen

import concurrent.futures
import math
import time

PRIMES = [
    112272535095293,
    112582705942171,
    112272535095293,
    115280095190773,
    115797848077099,
    1099726899285419]

def is_prime(n):
    if n % 2 == 0:
        return False

    sqrt_n = int(math.floor(math.sqrt(n)))
    for i in range(3, sqrt_n + 1, 2):
        if n % i == 0:
            return False
    return True

def multi():
    with concurrent.futures.ProcessPoolExecutor() as executor:
        for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
            print('%d is prime: %s' % (number, prime))

def single():
    for number, prime in enumerate(PRIMES, 1):
        print('%d is prime: %s' % (number, is_prime(prime)))

if __name__ == '__main__':
    for test in (single, multi):
        print('\nRunning: %s ...' % test.__name__)
        start_time = time.time()
        test()
        print('Duration %s: %s sec' % (test.__name__, time.time() - start_time))
    print()
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Das HT überhaupt nichts bringt konnte ich schon bei Matlab feststellen. Ich konnte bei einer kurzen Recherche vor einem Jahr nicht wirklich etwas finden bei welchem Szenario HT richtig was bringt.

Ich möchte auch mal ein paar Messwerte bei steuern, alle auf aktuellem Ubuntu 14.04 aufgezeichnet. Die i3 (BJ 2014) und i5 (BJ 2015) sind meine PCs an der Arbeit, der Core2Duo P8700 (BJ 2009) ist mein Laptop, ich habe privat auch noch einen Desktop PC mit Core2Duo E6700 (BJ 2006) der ist aber in einer ähnlichen Liga wie mein Laptop, nur etwas Schneller.

i3
2 cores, 4threads, HT
model name : Intel(R) Core(TM) i3 CPU 550 @ 3.20GHz
Duration single: 3.2120461463928223 sec
Duration multi: 1.680312156677246 sec

i5
4cores, 4threads, kein HT
model name : Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz
Duration single: 2.4400174617767334 sec
Duration multi: 0.9653730392456055 sec

Core2Duo P8700
2cores, 2threads, kein HT
model name : Intel(R) Core(TM)2 Duo CPU P8700 @ 2.53GHz
Duration single: 4.43257212638855 sec
Duration multi: 2.6466474533081055 sec

Ich sehe zZ keine Notwendigkeit meine Core2Duos abzulösen.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Intel Core i5-4670K 4x3,4GHz
Deine Version:
Duration single: 1.60865592957 sec
Duration multi: 0.76855802536 sec

Mit Numpy etwas beschleunigt:
Duration single: 0.475482940674 sec
Duration multi: 0.274882078171 sec

Code: Alles auswählen

import numpy as np
def is_prime(n):
    if n % 2 == 0:
        return False
    sqrt_n = int(math.floor(math.sqrt(n)))
    i = np.arange(3, sqrt_n + 1, 2)
    return not np.any(n % i == 0)
Wo ist eigentlich der Knopf um den Code hübsch angezeigt zu bekommen?
Zuletzt geändert von Anonymous am Donnerstag 12. November 2015, 21:04, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Der "Knopf" ist die Listbox direkt ueber dem Textfeld in dem "Code auswaehlen" steht.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@all: das Beispiel ist nicht sehr gut für einen Multi-Threading-Test ausgewählt. Es werden 5 ungefähr gleich große Primzahlen und eine nicht-Primzahl getestet. Bei 2 Threads muß einer 3 und einer 2 Primzahltests durchführen, bei 4 Threads einer 2 und die anderen jeweils einen. Das Aufwandsverhältnis ist also 5 : 3 : 2. Das Verhältnis 5 : 2 findet man z.B. sehr exakt beim i5-Test und das Verhältnis 5 : 3 beim Core2Duo.

@MegBen: Die Beschleunigung durch numpy ist nur deshalb so deutlich, weil es sich meist um ziemlich kleine Primzahlen handelt. Bei der Nicht-Primzahl ist das Zeitverhältnis nur 3:2 und auch nur deshalb so gut, weil beim kleinsten Primfaktor schon ungefähr 10% der Zahlen zu durchsuchen waren.
BlackJack

@all: Vielleicht ein blöde Frage aber hier habt nicht die Ausgabe des Programms gepostet sondern die nochmal durch 6 geteilt‽ Sonst hätte ich hier nämlich 'nen extrem langsamen i5 im Laptop. :shock:
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

@BlackJack Ich habe unverändert kbr's Code mit Python 3.4 auf Xubuntu 14.04 64bit laufen lassen.
BlackJack

Okay, das hier ist meine Ausgabe auf einem i5 mit 2 Kernen und 2,5 Ghz:

Running: single ...
1 is prime: True
2 is prime: True
3 is prime: True
4 is prime: True
5 is prime: True
6 is prime: False
Duration single: 23.1176199913 sec

Running: multi ...
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
Duration multi: 11.5212070942 sec

Das ist jetzt deutlich langsamer als ich bei den anderen veröffentlichten Prozessoren und Zahlen erwartet hätte. Ich habe aber sonst nicht den Eindruck das mein Laptop irgendwie langsam wäre. Bin verwirrt…
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

MacBook Air 11" Mid-2011 mit einem i7 1.8GHz.

Python 2.7
Duration single: 4.01982307434 sec
Duration multi: 2.61667490005 sec

Python 3.2
Duration single: 5.026734113693237 sec
Duration multi: 2.926298141479492 sec

Python 3.3
Duration single: 4.925715923309326 sec
Duration multi: 2.727151870727539 sec

Python 3.4
Duration single: 4.85546612739563 sec
Duration multi: 2.7406439781188965 sec

Python 3.5
Duration single: 5.7325029373168945 sec
Duration multi: 3.2812910079956055 sec

PyPy 2.6.0 (äquivalent zu Python 2.7.9)
Duration single: 0.435105085373 sec
Duration multi: 0.340698003769 sec

PyPy3 2.4.0 (äquivalent zu Python 3.2.5)
Duration single: 0.4650890827178955 sec
Duration multi: 0.29966187477111816 sec

Wir lernen mein Macbook kommt noch halbwegs mit, wenn man Performance haben will nimmt man PyPy und nicht multiprocessing und Python3... autsch.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Python 3.5, i7 6700k auf Windows 10

Code: Alles auswählen

$ python test.py

Running: single ...
1 is prime: True
2 is prime: True
3 is prime: True
4 is prime: True
5 is prime: True
6 is prime: False
Duration single: 4.509990453720093 sec

Running: multi ...
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
Duration multi: 1.5098845958709717 sec
Arch Linux:

Python 2.7

Code: Alles auswählen

╰─$ python2 test.py            

Running: single ...
1 is prime: True
2 is prime: True
3 is prime: True
4 is prime: True
5 is prime: True
6 is prime: False
Duration single: 1.75756001472 sec

Running: multi ...
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
Duration multi: 0.533525943756 sec
Python 3.5

Code: Alles auswählen

╰─$ python3 test.py

Running: single ...
1 is prime: True
2 is prime: True
3 is prime: True
4 is prime: True
5 is prime: True
6 is prime: False
Duration single: 2.438585042953491 sec

Running: multi ...
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
Duration multi: 0.9493045806884766 sec
PyPy 4 (~2.7)

Code: Alles auswählen

╰─$ ./pypy ../../test.py 

Running: single ...
1 is prime: True
2 is prime: True
3 is prime: True
4 is prime: True
5 is prime: True
6 is prime: False
Duration single: 0.232821941376 sec

Running: multi ...
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
Duration multi: 0.116915941238 sec
Yup, PyPy ist schnell...
the more they change the more they stay the same
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

aufgrund der erschreckend hohen Werte von BlackJack hat mich das dann doch mal interessiert...

alles Python 3.4:

Win7, Core i5-2400, 3.10 GHZ
* single: 4,62
* multi: 2,00

Ubuntu 14.04, Core2 Duo CPU T8100, 2.10GHz:
* single: 4,68
* multi: 2,94

Raspi Model B+, Raspbian Jessie:
* single: 160
* multi: 144

Gruß, noisefloor
BlackJack

@noisefloor: PyPy auf dem Raspi wäre vielleicht noch interessant. Falls Du Langeweile hast… :-)
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

für BlackJack:

Raspi B+ mit Raspbian Jessie, pypy 2.2.1 (aus den Paketquellen) + Futures 3.0.3:
* single: 62
* multi: 62

Hinweis: Hab's mit und ohne pypy mehrmals auf dem Raspi laufen lassen - die Zeiten schwanken so um +/- 5 Sekunden zwischen den Durchläufen. Mit pypy ist es aber immer ca. gleichschnell, unter Python 3.4 ist multi ziemlich konstant ca. 12-15 Sekunden schneller als single.

Gruß, noisefloor
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

i7-2640M (Ubuntu 14.04):
#> python3 bench.py

Running: single ...
1 is prime: True
2 is prime: True
3 is prime: True
4 is prime: True
5 is prime: True
6 is prime: False
Duration single: 2.753169059753418 sec

Running: multi ...
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
Duration multi: 1.7835943698883057 sec
Wandboard Quad (ein großer Bruder von Raspi, mit Ubuntu 12.04):
#> python3 bench.py

Running: single ...
1 is prime: True
2 is prime: True
3 is prime: True
4 is prime: True
5 is prime: True
6 is prime: False
Duration single: 37.55161499977112 sec

Running: multi ...
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
Duration multi: 14.450525999069214 sec
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Also irgendwie enttäuscht mein intel core2duo schon:


Running: single ...
1 is prime: True
2 is prime: True
3 is prime: True
4 is prime: True
^[[B5 is prime: True
6 is prime: False
Duration single: 29.459540605545044 sec

Running: multi ...
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
Duration multi: 21.63470149040222 sec

Hbin mal auf das ergebniss auf einem phenom x6 1100t.
Ergebnis de rasperry pi is eine echte überraschung für die minimalistische Hardware.
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Noch weitere Daten
alles python 3.4
AMD Phenom X6 1100T @Stock: (Kali linux)
single:3,43
multi:0,94

AMD Vision A8 4x1,9Ghz: (Ubuntu 15.xx)
single: 10,2
multi:4,2

pypy will leider nicht so wie ich will dar die version die ich geladen habe auf Python 2.7 basiert und das module concurrent nicht kennt. Leider lässt es sich auch nicht nachinstallieren....oder ich bin einfach zu blöd dafür gerade. mit pip gehts auf jeden fall nicht
Antworten