Warum läuft der Code mit timeit in einer Schleife

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.
Antworten
NoBody2
User
Beiträge: 12
Registriert: Mittwoch 8. November 2017, 01:49

Code: Alles auswählen

import timeit

def Prim1(m):
    e=3
    t=False
    tu=()
    while e<m:
        t=False
        for i in range(2,e-1):
            if e%i==0:
                t=True
        if t==False:
            print(e)
        e+=1
    return e

t1=timeit.Timer("Prim1(1000)","from __main__ import Prim1")
print("Prim1: ", t1.timeit())
Wenn ich normal Prim1(1000) ausführe, wird der Code nur einmal ausgeführt. Aber wenn ich es so mit timeit mache, läuft der Code in einer Schleife. Warum?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil Performance Messungen bedingt durch wechselnde Systemlasten immer gemittelt werden aus vielen Läufen.

In deinem Fall misst du allerdings weniger die Berechnung, sondern wie schnell dein Terminal Text ausgibt...
NoBody2
User
Beiträge: 12
Registriert: Mittwoch 8. November 2017, 01:49

Aber ich habe einen Beispielcode, bei dem es genauso ist, es aber nur einmal durchgeführt wird. Muss nicht auch timeit.repeat() verwendet werden, damit es mehrmals durchgeführt wird?
Und wenn jemand das schonmal liest: Gibt es eine Möglichkeit eine Wurzel nur auf eine oder keine Nachkommastelle zu berechnen (um Zeit zu sparen)?

Ich habe es jetzt übrigens so gemacht:

Code: Alles auswählen

start=time.perf_counter()
ende=time.perf_counter()
print(ende-start)
kleine Anmerkung: Es macht ja richtig Spaß Programme zu optimieren: Während die erste Version (wie hier oben) noch 93s für die Primzahlen bis 40000 gebraucht hat, braucht meine aktuelle Version 0,094 , also ziemlich genau ein tausendstel
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt AFAIK Näherungen in Assembler. Solange du aber nicht auch den Rest deines Problems in Maschinensprache löst - zB mit intrinsics in C++ - bringt dir das nichts.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@NoBody2: um Primzahlen zu berechnen, nimmt man ein Sieb. Das spart nochmal ein paar Größenordnungen Zeit.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Falls es beim Optimieren von aufwändigen Berechnungen nicht um den Spaß an der Sache geht, sondern wirklich um ein schnelles Programm, dann würde ich etwas anderes als Python nehmen, z.B. C, C++ oder Fortran. Falls man mehr Komfort wünscht und Abstriche bei der Performance machen kann, ist sicherlich auch das vielgenutzte NumPy in Python einen Blick wert. Hängt alles auch sehr vom konkreten Problem ab.
NoBody2
User
Beiträge: 12
Registriert: Mittwoch 8. November 2017, 01:49

Ja ich weiß, dass C schneller ist, aber es geht nur um den Spaß ^^
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Klingt nach sympy :D Wenn das nicht Spaß genug ist, dann würde ich mal nach Active State Recipe und Prime und in Verbindung mit Python googlen. Da wird es sicher eine performante Muster-Implementierung geben...

Persönlich würde ich zu sympy greifen, immer dann, wenn es um Primzahlen geht.
Antworten