exec - Globale Variable; und Performance Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

So ich habs mal auf List umgeschrieben.
Jetzt hab ich das Problem das ich lauter None Objekte in meine Liste bekomme.. für jede nicht Primzahl... Was kann ich dagegen tun?

Code: Alles auswählen

#!/usr/bin/env python 
import pickle
import time

def prime (n):
    for i in primeList:
        #if i > n/2: 
            #return None
        if n % i == 0: 
            return
        return n


primeList = [1]

#Lade pickle Datei
primePickleFile = open('primePickle.txt','rb')
primeList= pickle.load(primePickleFile)
primePickleFile.close

highest = primeList[-1] + 2

#Check prime numbers
t = time.time()
primeList = map(prime, xrange(highest,100000,2))
print time.time() - t

# insert 2
primeList.insert(0,2) 

#Write in File
Primefile = open('prime.txt','w')
Primefile.write(str(primeList).translate(None,'[]'))

#Write Pickle file
primePickle = open('primePickle.txt','wb')
pickle.dump(primeList,primePickle)
@sma:
typisch anfäger Fehler :x thx

MfG Tompazi
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

Jetzt hab ich es ganz versaut... er gibt mir nur mehr None zurück...

MfG Tompazi
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Tompazi hat geschrieben: Jetzt hab ich das Problem das ich lauter None Objekte in meine Liste bekomme.. für jede nicht Primzahl... Was kann ich dagegen tun?
Du schmeist diesen map()-Kram raus und testest explizit den Rückgabewert:

Code: Alles auswählen

for value in xrange(highest,100000,2):
    tmp_value = prime(value)
    if tmp_value:
        # primeList ist nicht PEP8 konform! Besser prime_values z.B.
        primeList.append(tmp_value)
Deine prime-Funktion kann man auch vereinfachen:

Code: Alles auswählen

def prime (n):
    for i in primeList:
        if not n % i:
            return n
EDIT:
So, musste mal wieder in den itertools wühlen:

Code: Alles auswählen

In [1]: from itertools import ifilter

In [2]: def foo(value):
   ...:     if value % 2:
   ...:         return value
   ...:
   ...:

In [3]: list(ifilter(foo, [1,2,3,4,5,6]))
Out[3]: [1, 3, 5]
Damit kann man das auch schön lösen :-)
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

zum ersten; ok;
zum zweiten nein weil das gibt mir keine Primzahl zurück.

das dritte verstehe ich nicht :oops:

Code: Alles auswählen

#!/usr/bin/env python 
import pickle
import time
import math

def prime (n):
    for i in prime_numbers:
        if i > math.sqrt(n):
            if n % i == 0:
                return None
        return n

prime_numbers = [3]
"""
#Lade pickle Datei
primePickleFile = open('primePickle.txt','rb')
prime_numbers= pickle.load(primePickleFile)  #geht nicht ..
primePickleFile.close
"""

highest = prime_numbers[-1]

#Check prime numbers
t = time.time()
for value in xrange(highest,100000,2):
    tmp_value = prime(value)
    if tmp_value:
        prime_numbers.append(tmp_value) 
print time.time() - t

# insert 2
prime_numbers.insert(0,2) 

#Write in File
Primefile = open('prime.txt','w')
Primefile.write(str(prime_numbers).translate(None,'[]'))

#Write Pickle file
primePickle = open('primePickle.txt','wb')
pickle.dump(prime_numbers,primePickle)
MfG Tompazi
Zuletzt geändert von Tompazi am Sonntag 2. August 2009, 17:21, insgesamt 1-mal geändert.
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

Meine Primzahlen sind nicht korrekt.. :cry:
*seufz*

Warum nur?

MfG Tompazi

PS: Ich habe noch ein paar algemeine Fragen;
kann ich Python Skripte zu ausführbaren Programmen kompilieren (sodass der Ausführende kein Python-Interpreter braucht)? Für Windows hab ich py2exe gefunden. Gibt es das auch für Linux; bzw. OS-X?

Wie handle ich Bilder? lib zum en/decoden von JPG; PNG; TGA etc.? und das so, dass ich die Bilder auf Canvas Objekte von TKinter Zeichnen kann?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Weil Du in der prime()-Funktion nach spätestens einem Durchlauf die Funktion verlässt. Hättest Du durch ein einfaches print rausgefunden ;-)

Daher klappt meine Optimierung auch nicht. Habs auch grad gesehen.

Du solltest die Liste auch besser übergeben und direkt in der Funktion erweitern - somit vermeidest Du eine globale Variable.

Welchen Algo zur Berechnung willst Du denn eigentlich implementieren?
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

Nachdem wir nun wissen, dass Primzahlen nicht all zu selten sind, müssen wir uns nun ein
Verfahren überlegen, mit dem man feststellen kann, ob eine zufällig gewählte Zahl tatsächlich
prim ist.
Eine einfache Methode ist das so genannte Probedivision (engl. trial-testing). Die Grundidee
dieses Verfahrens ist, n sukzessive durch Primzahlen 2, 3, 5, 7, 11,..., < n (Sieb des
Eratosthenes) zu teilen.

Code: Alles auswählen

def prime (n):
    for i in prime_numbers:
        if i > math.sqrt(n):
            if n % i == 0:
                return None
        return n
Leider bekomme ich da zu viele nicht Primzahlen zurück...

MfG Tompazi
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Tompazi hat geschrieben:Leider bekomme ich da zu viele nicht Primzahlen zurück...
Dann denke doch noch einmal über die Position des letzten return nach. Zur Not füge einfach zwischen zwei Zeilen immer ein print ein und lasse dir etwas ausgeben.

Auch die erste Bedingung in der Schleife ist falsch.

i<sqrt(n) <=> i**2 < n; i,n >= 0

Edit: ja, meine ich
Zuletzt geändert von EyDu am Sonntag 2. August 2009, 17:36, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

EyDu hat geschrieben: i<sqrt(n) <=> i*2 < n; i,n >= 0
meinst du nicht i**2?
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

Ich komme nicht dahinter ..

MfG Tompazi
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dann zeig uns doch mal Deinen Code der prime()-Funktion mit den print-Statements zum Debugging. Du musst uns schon zeigen, was Du so probiert hast - raten können wir da nicht.
Antworten