Seite 1 von 1

Warum läuft der Code mit timeit in einer Schleife

Verfasst: Sonntag 26. November 2017, 21:53
von NoBody2

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?

Re: Warum läuft der Code mit timeit in einer Schleife

Verfasst: Sonntag 26. November 2017, 22:07
von __deets__
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...

Re: Warum läuft der Code mit timeit in einer Schleife

Verfasst: Sonntag 26. November 2017, 22:26
von NoBody2
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

Re: Warum läuft der Code mit timeit in einer Schleife

Verfasst: Sonntag 26. November 2017, 23:16
von __deets__
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.

Re: Warum läuft der Code mit timeit in einer Schleife

Verfasst: Montag 27. November 2017, 00:05
von Sirius3
@NoBody2: um Primzahlen zu berechnen, nimmt man ein Sieb. Das spart nochmal ein paar Größenordnungen Zeit.

Re: Warum läuft der Code mit timeit in einer Schleife

Verfasst: Montag 27. November 2017, 00:32
von snafu
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.

Re: Warum läuft der Code mit timeit in einer Schleife

Verfasst: Montag 27. November 2017, 17:42
von NoBody2
Ja ich weiß, dass C schneller ist, aber es geht nur um den Spaß ^^

Re: Warum läuft der Code mit timeit in einer Schleife

Verfasst: Montag 27. November 2017, 19:32
von pixewakb
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.