by Guest » 12 Jan 2025, 18:00
Ich habe einen Algorithmus geschrieben, der eine lange Liste verwendet. Da numpy.array bei der Verarbeitung langer Daten eine bessere Leistung erbringen sollte, habe ich eine andere Version mit numpy.array geschrieben.
Listenversion:
Code: Select all
import math
def PrimeTable(n:int) -> list[int]:
nb2m1 = n//2 - 1
l = [True]*nb2m1
for i in range(1,(math.isqrt(n)+1)//2):
if l[i-1]:
for j in range(i*3,nb2m1,i*2+1):
l[j] = False
return [2] + [i for i,v in zip(range(3,n,2), l) if v]
Array-Version:
Code: Select all
import math, numpy
def PrimeTable2(n:int) -> list[int]:
nb2m1 = n//2 - 1
l = numpy.full(nb2m1, True)
for i in range(1,(math.isqrt(n)+1)//2):
if l[i-1]:
for j in range(i*3,nb2m1,i*2+1):
l[j] = False
return [2] + [i for i,v in zip(range(3,n,2), l) if v]
Es stellt sich heraus, dass die numpy.array-Version 1x langsamer ist als die list-Version. Das Diagramm:

wobei y0 PrimeTable und y1 PrimeTable2 ist
Warum? numpy.array ist so langsam, und wie kann ich es verbessern?
Ich habe einen Algorithmus geschrieben, der eine lange Liste verwendet. Da numpy.array bei der Verarbeitung langer Daten eine bessere Leistung erbringen sollte, habe ich eine andere Version mit numpy.array geschrieben.
Listenversion:
[code]import math
def PrimeTable(n:int) -> list[int]:
nb2m1 = n//2 - 1
l = [True]*nb2m1
for i in range(1,(math.isqrt(n)+1)//2):
if l[i-1]:
for j in range(i*3,nb2m1,i*2+1):
l[j] = False
return [2] + [i for i,v in zip(range(3,n,2), l) if v]
[/code]
Array-Version:
[code]import math, numpy
def PrimeTable2(n:int) -> list[int]:
nb2m1 = n//2 - 1
l = numpy.full(nb2m1, True)
for i in range(1,(math.isqrt(n)+1)//2):
if l[i-1]:
for j in range(i*3,nb2m1,i*2+1):
l[j] = False
return [2] + [i for i,v in zip(range(3,n,2), l) if v]
[/code]
Es stellt sich heraus, dass die numpy.array-Version 1x langsamer ist als die list-Version. Das Diagramm:
[img]https://i.sstatic.net/4hfbNxXL.jpg[/img]
wobei y0 PrimeTable und y1 PrimeTable2 ist
Warum? numpy.array ist so langsam, und wie kann ich es verbessern?