Python Leistungstests sprechen gegen verfrühte Optimierungsmaßnahmen

“Vorzeitige Optimierung ist die Wurzel allen Übels”

Heute bei der Programmierung fand ich mich bei dem Gedanken über die Auswirkungen auf die Leistung der verschiedenen Grund-Python Operationen wie Methodenaufruf, der “in”-Operator, etc.

Das ist ein Fehler, weil Sie sollten wirklich nicht über diese Dinge nachdenken, während der Programmierung. Die Auswirkungen auf die Leistung, die Dinge ein Weg vs andere Art ist in der Regel so klein, dass man nicht messen kann.

Neben oft Ihr Programm IO statt der CPU verbunden, die, selbst wenn Sie CPU-Zeit magisch auf 0 optimiert würden Sie wahrscheinlich nicht bemerkt, dass sowieso Mittel gebunden.

Der richtige Weg, um über die Optimierung gehen, ist es ganz einfach ignorieren und auf die Optimierung der Lesbarkeit. Optimieren für Leistung ist das letzte, was Sie tun sollten. Buchstäblich. Wenn Sie mit der Programmierung fertig und du entdeckst du wirklich tun müssen, um Squeeze-out mehr Leistung aus Ihrem Programm, das Sie es durch einen Profiler ausführen können, identifizieren Sie die Hotspots, wo Ihr Programm den größten Teil seiner Zeit ist und gehen Sie dann zu optimieren diese für eine bessere IO oder CPU Leistung.

Aber … Ich war immer noch neugierig auf Python die Leistung so dass ich einige Tests lief. Nur um meinen Geist zu beruhigen. Und weil es ganz nett ist, die Dinge, die buchstäblich geschieht, sind Millionen von Mal pro Sekunde messen.

Einige interessante Fakten (mein Computer, einen Thread):

  • Im Allgemeinen ist hohe Pythonic Code schneller als vergleichbare niedrigere Python-Code.
  • Python ist null-op, “pass” laufen kann 50M-mal pro Sekunde
  • Funktionsaufrufe kann passieren, 6.5M Mal pro Sekunde
  • Instanzen können erstellt 3.5M mal ein zweites
  • Wenn Vergleiche, eingestellt ist schneller als Array, wenn Sie mehr als 5 Elemente haben:
    # execution time increases linearly with size of array
    # runs at 40M comparisons a second
    # if len(array) == 1000000 this will run 40 times a second
    val in array
    
    # execution time constant
    # runs 8M times a second
    val in set
    
  • set (iterable) ist 4X langsamer als Liste (iterable), aber immer noch sehr schnell

    In 1 Sekunde == erstellen Sie ein Set mit 130.000 Elementen. In 1 Sekunde == erstellen Sie eine Liste mit 446.000 Elementen.

Bottom line: Denken über das Schreiben gut optimiert Python-Code wird normalerweise eine Verschwendung von Zeit und Energie.
Appendix

Hier ist eine kleine Code-Schnipsel Ich benutze zu Zeit stuff:

import os
import time

def bench(f, howmany):
    start = time.time()
    for i in xrange(howmany):
        f()
    end = time.time()

    elapsed = end - start

    print "%d runs in %.4f seconds (%.2f per/sec)" % (howmany, elapsed, howmany / elapsed)

Die timeit Modul aus der Standard-Bibliothek kann in nützlicher als auch kommen:

import timeit

# by default timeit runs a million times
timeit.Timer(stmt="pass").timeit()
timeit.Timer(stmt="pass").timeit()

# how many times a second
1 / timeit.Timer("pass").timeit(1000) * 1000