Seite 1 von 1

Multiprocessing auf alter und neuer Hardware

Verfasst: Mittwoch 11. November 2015, 17:11
von kbr
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()

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Donnerstag 12. November 2015, 18:28
von Sr4l
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.

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Donnerstag 12. November 2015, 20:38
von MagBen
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?

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Donnerstag 12. November 2015, 20:50
von cofi
Der "Knopf" ist die Listbox direkt ueber dem Textfeld in dem "Code auswaehlen" steht.

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Freitag 13. November 2015, 08:24
von Sirius3
@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.

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Samstag 14. November 2015, 21:31
von 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:

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Samstag 14. November 2015, 22:29
von Sr4l
@BlackJack Ich habe unverändert kbr's Code mit Python 3.4 auf Xubuntu 14.04 64bit laufen lassen.

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Samstag 14. November 2015, 22:32
von 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…

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Sonntag 15. November 2015, 00:29
von DasIch
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.

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Dienstag 17. November 2015, 00:50
von Dav1d
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...

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Mittwoch 18. November 2015, 17:27
von noisefloor
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

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Mittwoch 18. November 2015, 17:47
von BlackJack
@noisefloor: PyPy auf dem Raspi wäre vielleicht noch interessant. Falls Du Langeweile hast… :-)

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Mittwoch 18. November 2015, 19:53
von noisefloor
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

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Donnerstag 19. November 2015, 16:03
von jerch
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

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Freitag 8. Januar 2016, 19:35
von dannyboy385
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.

Re: Multiprocessing auf alter und neuer Hardware

Verfasst: Freitag 8. Januar 2016, 20:52
von dannyboy385
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