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()